ZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2NoLmggYi9wL2RhZW1vbi9jaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmVkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9jaC5oCkBAIC0wLDAgKzEsMTAgQEAKKy8vIGNoLmggLSBjaGFubmVsIGRhZW1vbiBkZWZpbmVzCisvLyAtLQorLy8gJHRpbWVzdGFtcDo6JAorCisvLyBleGlzdGllcnQgYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiwgd2VpbCBkaWUgaGFlbGZ0ZSB2b20gTXVkIGRpZXNlcyB1bmQKKy8vIGRpZSBhbmRlcmUgSGFlbGZ0ZSBjaGFubmVsLmggaW5rbHVkaWVydC4gRW50c2NoZWlkdW5nLCBkZW4gZWluZGV1dGlnZXJlbgorLy8gTmFtZW4gY2hhbm5lbC5oIHp1IGJlbnV0emVuIHVuZCBkaWVzZXMgZWluZmFjaCBjaGFubmVsLmggaW5rbHVkaWVyZW4genUKKy8vIGxhc3Nlbi4KKyNpbmNsdWRlICJjaGFubmVsLmgiCisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2NoYW5uZWwuaCBiL3AvZGFlbW9uL2NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDFmNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vY2hhbm5lbC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIGNoLmggLSBjaGFubmVsIGRhZW1vbiBkZWZpbmVzCisvLyAtLQorLy8gJHRpbWVzdGFtcDo6JAorCisjaWZuZGVmIF9fREFFTU9OX0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fREFFTU9OX0NIQU5ORUxfSF9fCisKKyNkZWZpbmUgUF9DSEFOTkVMUwkJImNoYW5uZWxzIgorI2RlZmluZSBQX1NURF9DSEFOTkVMCQkic3RkX2NoYW5uZWwiCisKKyNkZWZpbmUgQ0hNQVNURVIJCSIvcC9kYWVtb24vY2hhbm5lbGQiCisKKy8vIE1lc3NhZ2UgdHlwZXMKKyNkZWZpbmUgTVNHX1NBWSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNU0dfRU1PVEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1TR19HRU1PVEUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVNHX0VNUFRZICAgICAgICAgICAgICAgMworCisvLyBFcnJvcnMKKyNkZWZpbmUgRV9BQ0NFU1NfREVOSUVEICAgICAgICAgLTEKKyNkZWZpbmUgRV9BTFJFQURZX0pPSU5FRCAgICAgICAgLTIKKyNkZWZpbmUgRV9OT1RfTUVNQkVSICAgICAgICAgICAgLTMKKyNkZWZpbmUgRV9FTVBUWV9NRVNTQUdFICAgICAgICAgLTQKKyNkZWZpbmUgRV9VTktOT1dOX1RZUEUgICAgICAgICAgLTUKKworLy8gQ29tbWFuZHMKKyNkZWZpbmUgQ19ORVcJCQkibmV3IgorI2RlZmluZSBDX0pPSU4JCQkiam9pbiIKKyNkZWZpbmUgQ19MRUFWRQkJCSJsZWF2ZSIKKyNkZWZpbmUgQ19TRU5ECQkJInNlbmQiCisjZGVmaW5lIENfTElTVAkJCSJsaXN0IgorI2RlZmluZSBDX0ZJTkQJCQkiZmluZCIKKworLy8gZGVmaW5pdGlvbiBvZiB0aGUgbGlzdCBtYXBwaW5nIGVudHJ5IAorLy8gKFsgY2hhbm5lbG5hbWUgOiAoeyBJX01FTUJFUiwgSV9BQ0NFU1MsIElfSU5GTywgSV9NQVNURVIsIElfTkFNRSB9KSBdKQorI2RlZmluZSBJX01FTUJFUiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElfQUNDRVNTICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSV9JTkZPICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJX01BU1RFUgkJMworI2RlZmluZSBJX05BTUUJCQk0CisKKyNlbmRpZiAvL19fREFFTU9OX0NIQU5ORUxfSF9fCisKKy8vIHByb3RvdHlwZXMKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0NIQU5ORUxfSF9QUk9UT19fCisjZGVmaW5lIF9fQ0hBTk5FTF9IX1BST1RPX18KK3ZhcmFyZ3MgaW50IG5ldyhzdHJpbmcgY2gsIG9iamVjdCBwbCwgbWl4ZWQgaW5mbyk7Cit2YXJhcmdzIGludCBzZW5kKHN0cmluZyBjaCwgb2JqZWN0IHBsLCBzdHJpbmcgbXNnLCBpbnQgdHlwZSk7CisKKy8vIG9rLCBrZWluZSBQcm90b3R5cGVuLCBhYmVyIHRyb3R6ZGVtIG51ciBmdWVyIGNoYW5uZWxkLmMgaW50ZXJlc3NhbnQuCisjZGVmaW5lIE1BWF9ISVNUX1NJWkUgICAyMDAKKyNkZWZpbmUgTUFYX0NIQU5ORUxTICAgIDkwCisKKyNlbmRpZiAvL19fQ0hBTk5FTF9IX1BST1RPX18KKworI2VuZGlmIC8vTkVFRF9QUk9UT1RZUEVTCisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2NoYW5uZWxkLmMgYi9wL2RhZW1vbi9jaGFubmVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzFkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9jaGFubmVsZC5jCkBAIC0wLDAgKzEsNjQ3IEBACisvLyBjaGFubmVsZC5jCisvLworLy8gJElkOiBjaGFubmVsZC5jIDkxMzggMjAxNS0wMi0wMyAyMTo0Njo1NlogWmVzc3RyYSAkCisvLworCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBub19zaGFkb3cgLy8ga2VpbmUgU2hhZG93aW5nLi4uCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgc2F2ZV90eXBlcworCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisjaW5jbHVkZSA8bHBjdHlwZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgImNoYW5uZWwuaCIKKworI2RlZmluZSBDTU5BTUUgICI8TWFzdGVSPiIKKyNkZWZpbmUgQ0hBTk5FTF9TQVZFICAgICIvcC9kYWVtb24vc2F2ZS9jaGFubmVsZCIKKworI2RlZmluZSBNRU1PUlkgIi9zZWN1cmUvbWVtb3J5IgorCisvLyBjaGFubmVscyAtIGNvbnRhaW5zIHRoZSBzaW1wbGUgY2hhbm5lbCBpbmZvcm1hdGlvbgorLy8gICAgICAgICAgICAoWyBjaGFubmVsbmFtZSA6ICh7IElfTUVNQkVSLCBJX0FDQ0VTUywgSV9JTkZPLCBJX01BU1RFUiB9KS4uLl0pCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxvd2VyY2g7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGNoYW5uZWxzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBjaGFubmVsSDsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgc3RhdHM7CisKK3ByaXZhdGUgbWFwcGluZyBjaGFubmVsQzsKK3ByaXZhdGUgbWFwcGluZyBjaGFubmVsQjsKKworcHJpdmF0ZSBpbnQgc2F2ZV9tZV9zb29uOworCisvLyBCRUdJTiBPRiBUSEUgQ0hBTk5FTCBNQVNURVIgQURNSU5JU1RSQVRJVkUgUEFSVAorCisjZGVmaW5lIFJFQ1YgICAgMAorI2RlZmluZSBTRU5EICAgIDEKKyNkZWZpbmUgRkxBRyAgICAyCisKKy8vIENoYW5uZWwgZmxhZ3MKKy8vIExldmVsYmVzY2hyYWVua3VuZ2VuIGdlZ2VuIE1hZ2llcmxldmVsIChxdWVyeV93aXpfbGV2ZWwpIHBydWVmZW4sIG5pY2h0CisvLyBQX0xFVkVMLgorI2RlZmluZSBGX1dJWkFSRCAxCisvLyBLZWluZSBHYWVzdGUuIDstKQorI2RlZmluZSBGX05PR1VFU1QgMgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGFkbWluID0gbV9hbGxvY2F0ZSgwLCAzKTsKKworaW50IGNoZWNrKHN0cmluZyBjaCwgb2JqZWN0IHBsLCBzdHJpbmcgY21kKQoreworICBpbnQgbGV2ZWw7CisgIAorICBpZigoYWRtaW5bY2gsIEZMQUddICYgRl9OT0dVRVNUKSAmJiBwbC0+UXVlcnlHdWVzdCgpKSByZXR1cm4gMDsKKworICBpZigoYWRtaW5bY2gsIEZMQUddICYgRl9XSVpBUkQpICYmIHF1ZXJ5X3dpel9sZXZlbChwbCkgPCBTRUVSX0xWTCkgcmV0dXJuIDA7CisgIGxldmVsID0gKGFkbWluW2NoLCBGTEFHXSAmIEZfV0laQVJECisgICAgICAgICAgID8gcXVlcnlfd2l6X2xldmVsKHBsKQorICAgICAgICAgICA6IHBsLT5RdWVyeVByb3AoUF9MRVZFTCkpOworCisgIHN3aXRjaChjbWQpCisgIHsKKyAgY2FzZSBDX0ZJTkQ6CisgIGNhc2UgQ19MSVNUOgorICBjYXNlIENfSk9JTjoKKyAgICBpZihhZG1pbltjaCwgUkVDVl0gPT0gLTEpIHJldHVybiAwOworICAgIGlmKGFkbWluW2NoLCBSRUNWXSA8PSBsZXZlbCkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIGNhc2UgQ19TRU5EOgorICAgIGlmKGFkbWluW2NoLCBTRU5EXSA9PSAtMSkgcmV0dXJuIDA7CisgICAgaWYoYWRtaW5bY2gsIFNFTkRdIDw9IGxldmVsKSByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgY2FzZSBDX0xFQVZFOgorICAgIHJldHVybiAxOworICBkZWZhdWx0OiBicmVhazsKKyAgfQorICByZXR1cm4oMCk7Cit9CisKK3ByaXZhdGUgaW50IENvdW50VXNlcihtYXBwaW5nIGwpCit7CisgIG1hcHBpbmcgbjsKKyAgbiA9IChbXSk7CisgIHdhbGtfbWFwcGluZyhsLCBsYW1iZGEoKHsnaS8qJyovLCAnYS8qJyovLCAnbi8qJyovfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJys9LyonKi8sICduLyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnbWttYXBwaW5nLyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLyonKi8sICdhLyonKi8sIDB9KX0pfSkpLAorICAgICAgICAgICAgICAgJm4pOworICByZXR1cm4gc2l6ZW9mKG4pOworfQorCitwcml2YXRlIHZvaWQgYmFubmVkKHN0cmluZyBuLCBtaXhlZCBjbWRzLCBzdHJpbmcgcmVzKQoreworICByZXMgKz0gc3ByaW50ZigiJXMgWyVzXSwgIiwgY2FwaXRhbGl6ZShuKSwgaW1wbG9kZShjbWRzLCAiLCIpKTsKK30KKworcHJpdmF0ZSBtYXBwaW5nIFRjbWQgPSAoW10pOworI2RlZmluZSBUSU1FT1VUICh0aW1lKCkgLSA2MCkKKwordm9pZCBDaGFubmVsTWVzc2FnZShtaXhlZCBtc2cpCit7CisgIHN0cmluZyByZXQsIG1lc2c7CisgIG1peGVkIGxhZzsKKyAgaW50IG1heCwgcmVrb3JkOworICBzdHJpbmcgdG1wOworICBpZihtc2dbMV0gPT0gdGhpc19vYmplY3QoKSB8fCAhc3RyaW5ncChtc2dbMl0pIHx8CisgICAgIG1zZ1swXSAhPSBDTU5BTUUgfHwgcHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKSkgcmV0dXJuOworCisKKyAgbWVzZyA9IGxvd2VyX2Nhc2UobXNnWzJdKTsKKworICBpZighc3Ryc3RyKCJoaWxmZSIsIG1lc2cpICYmIHNpemVvZihtZXNnKSA8PSA1KQorICAgIHJldCA9ICJGb2xnZW5kZSBLb21tYW5kb3MgZ2lidCBlczogaGlsZmUsIGxhZywgdXBbdGltZV0sIHN0YXRpc3RpaywgYmFubiI7CisgIGVsc2UKKyAgaWYoIXN0cnN0cigibGFnIiwgbWVzZykgJiYgc2l6ZW9mKG1lc2cpIDw9IDMpCisgIHsKKyAgICBpZihUY21kWyJsYWciXSA+IFRJTUVPVVQpIHJldHVybjsKKyAgICBUY21kWyJsYWciXSA9IHRpbWUoKTsKKyAgICBsYWcgPSAiL3AvZGFlbW9uL2xhZy1vLWRhZW1vbiItPnJlYWRfZXh0X2xhZ19kYXRhKCk7CisgICAgcmV0ID0gc3ByaW50ZigiTGFnOiAlLjFmJSUvNjAsICUuMWYlJS8xNSwgJS4xZiUlLzUsICUuMWYlJS8xLCAiCisgICAgICAgICAgICAgICAgICAgICAgICIlLjFmJSUvMjBzLCAlLjFmJSUvMnMiLAorICAgICAgICAgICAgICAgICAgbGFnWzVdLCBsYWdbNF0sIGxhZ1szXSwgbGFnWzJdLCBsYWdbMV0sIGxhZ1swXSk7CisgICAgY2FsbF9vdXQoIydzZW5kLyonKi8sIDIsIENNTkFNRSwgdGhpc19vYmplY3QoKSwgcmV0KTsKKyAgICByZXQgPSBxdWVyeV9sb2FkX2F2ZXJhZ2UoKTsKKyAgfSBlbHNlCisgIGlmKCFzdHJzdHIoInVwdGltZSIsIG1lc2cpICYmIHNpemVvZihtZXNnKSA8PSA2KQorICB7CisgICAgaWYoVGNtZFsidXB0aW1lIl0gPiBUSU1FT1VUKSByZXR1cm47CisgICAgVGNtZFsidXB0aW1lIl0gPSB0aW1lKCk7CisgICAgaWYoZmlsZV9zaXplKCIvZXRjL21heHVzZXJzIikgPD0gMCkgeworICAgICAgcmV0ID0gIkRpZXNlIEluZm9ybWF0aW9uIGxpZWd0IG5pY2h0IHZvci4iOworICAgIH0gZWxzZSB7CisgICAgICBzc2NhbmYocmVhZF9maWxlKCIvZXRjL21heHVzZXJzIiksICIlZCAlcyIsIG1heCwgdG1wKTsKKyAgICAgIHNzY2FuZihyZWFkX2ZpbGUoIi9ldGMvbWF4dXNlcnMuZXZlciIpLCAiJWQgJXMiLCByZWtvcmQsIHRtcCk7CisgICAgICByZXQgPSBzcHJpbnRmKCJEYXMgTVVEIGxhZXVmdCBqZXR6dCAlcy4gRXMgc2luZCBtb21lbnRhbiAlZCBTcGllbGVyICIKKyAgICAgICAgICAgICAgICAgICJlaW5nZWxvZ2d0OyBkYXMgTWF4aW11bSBsYWcgaGV1dGUgYmVpICVkIHVuZCBkZXIgUmVrb3JkICIKKyAgICAgICAgICAgICAgICAgICJiaXNoZXIgaXN0ICVkLiIsIHVwdGltZSgpLCBzaXplb2YodXNlcnMoKSksIG1heCwgcmVrb3JkKTsKKyAgICB9CisgIH0gZWxzZQorICBpZighc3Ryc3RyKCJzdGF0aXN0aWsiLCBtZXNnKSAmJiBzaXplb2YobWVzZykgPD0gOSkKKyAgeworICAgIGlmKFRjbWRbInN0YXRpc3RpayJdID4gVElNRU9VVCkgcmV0dXJuOworICAgIFRjbWRbInN0YXRpc3RpayJdID0gdGltZSgpOworICAgIHJldCA9IHNwcmludGYoCisgICAgIkltIE1vbWVudCBzaW5kIGluc2dlc2FtdCAlZCBFYmVuZW4gbWl0ICVkIFRlaWxuZWhtZXJuIGFrdGl2LlxuIgorICAgICJEZXIgJXMgd3VyZGUgZGFzIGxldHp0ZSBtYWwgYW0gJXMgdm9uICVzIG5ldSBnZXN0YXJ0ZXQuXG4iCisgICAgIlNlaXRkZW0gd3VyZGVuICVkIEViZW5lbiBuZXUgZXJ6ZXVndCB1bmQgJWQgemVyc3RvZXJ0LlxuIiwKKyAgICBzaXplb2YoY2hhbm5lbHMpLCBDb3VudFVzZXIoY2hhbm5lbHMpLCBDTU5BTUUsCisgICAgZHRpbWUoc3RhdHNbInRpbWUiXSksIHN0YXRzWyJib290Il0sIHN0YXRzWyJuZXciXSwgc3RhdHNbImRpc3Bvc2UiXSk7CisgIH0gZWxzZQorICBpZighc3Ryc3RyKG1lc2csICJiYW5uIikpCisgIHsKKyAgICBzdHJpbmcgcGwsIGNtZDsKKyAgICBpZihtZXNnID09ICJiYW5uIikKKyAgICAgIGlmKHNpemVvZihjaGFubmVsQikpCisgICAgICB7CisgICAgICAgIHJldCA9ICIiOworICAgICAgICB3YWxrX21hcHBpbmcoY2hhbm5lbEIsICMnYmFubmVkLyonKi8sICZyZXQpOworICAgICAgICByZXQgPSAiRnVlciBmb2xnZW5kZSBTcGllbGVyIGJlc3RlaHQgZWluIEJhbm46ICIgKyByZXQ7CisgICAgICB9IGVsc2UgcmV0ID0gIlp1ciBaZWl0IGlzdCBrZWluIEJhbm4gYWt0aXYuIjsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYoc3NjYW5mKG1lc2csICJiYW5uICVzICVzIiwgcGwsIGNtZCkgPT0gMiAmJgorICAgICAgICAgSVNfREVQVVRZKG1zZ1sxXSkpCisgICAgICB7CisjICAgICBkZWZpbmUgQ01EUyAoe0NfRklORCwgQ19MSVNULCBDX0pPSU4sIENfTEVBVkUsIENfU0VORCwgQ19ORVd9KQorICAgICAgICBwbCA9IGxvd2VyX2Nhc2UocGwpOyBjbWQgPSBsb3dlcl9jYXNlKGNtZCk7CisgICAgICAgIGlmKG1lbWJlcihDTURTLCBjbWQpICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgaWYoIXBvaW50ZXJwKGNoYW5uZWxCW3BsXSkpCisgICAgICAgICAgICBjaGFubmVsQltwbF0gPSAoe30pOworICAgICAgICAgIGlmKG1lbWJlcihjaGFubmVsQltwbF0sIGNtZCkgIT0gLTEpCisgICAgICAgICAgICBjaGFubmVsQltwbF0gLT0gKHsgY21kIH0pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoYW5uZWxCW3BsXSArPSAoeyBjbWQgfSk7CisgICAgICAgICAgcmV0ID0gIkZ1ZXIgJyIrY2FwaXRhbGl6ZShwbCkrIicgYmVzdGVodCAiCisgICAgICAgICAgICArIChzaXplb2YoY2hhbm5lbEJbcGxdKSA/CisgICAgICAgICAgICAgICAiZm9sZ2VuZGVyIEJhbm46ICIraW1wbG9kZShjaGFubmVsQltwbF0sICIsICIpIDoKKyAgICAgICAgICAgICAgICJrZWluIEJhbm4gbWVoci4iKTsKKyAgICAgICAgICBpZighc2l6ZW9mKGNoYW5uZWxCW3BsXSkpCisgICAgICAgICAgICBjaGFubmVsQiA9IG1fY29weV9kZWxldGUoY2hhbm5lbEIsIHBsKTsKKyAgICAgICAgICBzYXZlX29iamVjdChDSEFOTkVMX1NBVkUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgcmV0ID0gIkRhcyBLb21tYW5kbyAnIitjbWQrIicgaXN0IHVuYmVrYW5udC4gRXJsYXVidGUgS29tbWFuZG9zOiAiCisgICAgICAgICAgICAgICArIGltcGxvZGUoQ01EUywgIiwgIik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmKCFJU19BUkNIKG1zZ1sxXSkpIHJldHVybjsKKyAgICAgICAgZWxzZSByZXQgPSAiU3ludGF4OiBiYW5uIDxuYW1lPiA8a29tbWFuZG8+IjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZihtZXNnID09ICJsdXN0IikKKyAgeworICAgIG1peGVkIHQsIHVwOworICAgIGlmKFRjbWRbImxhZyJdID4gVElNRU9VVCB8fAorICAgICAgIFRjbWRbInN0YXRpc3RpayJdID4gVElNRU9VVCB8fAorICAgICAgIFRjbWRbInVwdGltZSJdID4gVElNRU9VVCkgcmV0dXJuOworICAgIFRjbWRbImxhZyJdID0gdGltZSgpOworICAgIFRjbWRbInN0YXRpc3RpayJdID0gdGltZSgpOworICAgIFRjbWRbInVwdGltZSJdID0gdGltZSgpOworICAgIGxhZyA9ICIvcC9kYWVtb24vbGFnLW8tZGFlbW9uIi0+cmVhZF9sYWdfZGF0YSgpOworCisgICAgc3NjYW5mKHJlYWRfZmlsZSgiL2V0Yy9tYXh1c2VycyIpLCAiJWQgJXMiLCBtYXgsIHRtcCk7CisgICAgc3NjYW5mKHJlYWRfZmlsZSgiL2V0Yy9tYXh1c2Vycy5ldmVyIiksICIlZCAlcyIsIHJla29yZCwgdG1wKTsKKworICAgIHQ9dGltZSgpLWxhc3RfcmVib290X3RpbWUoKTsKKyAgICB1cD0iIjsKKyAgICBpZih0ID49IDg2NDAwKQorICAgICAgdXAgKz0gc3ByaW50ZigiJWRUIiwgdC84NjQwMCk7CisgICAgaWYodCA+PSAzNjAwKQorICAgICAgdXAgKz0gc3ByaW50ZigiJWRoIiwgKHQ9dCU4NjQwMCkvMzYwMCk7CisgICAgaWYodCA+IDYwKQorICAgICAgdXAgKz0gc3ByaW50ZigiJWRtIiwgKHQ9dCUzNjAwKS82MCk7CisgICAgdXAgKz0gc3ByaW50ZigiJWRzIiwgdCU2MCk7CisKKyAgICByZXQgPSBzcHJpbnRmKCIlLjFmJSUvMTUgJS4xZiUlLzEgJXMgJWQ6JWQ6JWQgRTolZCBUOiVkIiwKKyAgICAgICAgICAgICAgICAgIGxhZ1sxXSwgbGFnWzJdLCB1cCwgc2l6ZW9mKHVzZXJzKCkpLCBtYXgsIHJla29yZCwgCisgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhbm5lbHMpLCBDb3VudFVzZXIoY2hhbm5lbHMpKTsKKyAgfSBlbHNlIHJldHVybjsKKworICBjYWxsX291dCgjJ3NlbmQvKicqLywgMiwgQ01OQU1FLCB0aGlzX29iamVjdCgpLCByZXQpOworfQorCisvLyBzZXR1cCgpIC0tIHNldCB1cCBhIGNoYW5uZWwgYW5kIHJlZ2lzdGVyIGl0CisvLyAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgc3RvcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisvLyAgICAgICAgICAgICh7IGNoYW5uZWwgbmFtZSwKKy8vICAgICAgICAgICAgICAgcmVjZWl2ZSBsZXZlbCwgc2VuZCBsZXZlbCwKKy8vICAgICAgICAgICAgICAgZmxhZ3MsCisvLyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLAorLy8gICAgICAgICAgICAgICBtYXN0ZXIgb2JqCisvLyAgICAgICAgICAgIH0pCitwcml2YXRlIHZvaWQgc2V0dXAobWl4ZWQgYykKK3sKKyAgY2xvc3VyZSBjbDsKKyAgb2JqZWN0IG07CisgIHN0cmluZyBkOworICBkID0gIi0gS2VpbmUgQmVzY2hyZWlidW5nIC0iOworICBtID0gdGhpc19vYmplY3QoKTsKKyAgaWYoc2l6ZW9mKGMpICYmIHNpemVvZihjWzBdKSA+IDEgJiYgY1swXVswXSA9PSAnXFwnKQorICAgIGNbMF0gPSBjWzBdWzEuLl07CisKKyAgc3dpdGNoKHNpemVvZihjKSkKKyAgeworICBjYXNlIDY6CisgICAgaWYoIXN0cmluZ3AoY1s1XSkgfHwgIXNpemVvZihjWzVdKSAKKyAgICAgICAgfHwgKGNhdGNoKG09bG9hZF9vYmplY3QoY1s1XSk7cHVibGlzaCkgfHwgIW9iamVjdHAobSkgKSkKKyAgICAgIG0gPSB0aGlzX29iamVjdCgpOworICBjYXNlIDU6IGQgPSBzdHJpbmdwKGNbNF0pIHx8IGNsb3N1cmVwKGNbNF0pID8gY1s0XSA6IGQ7CisgIGNhc2UgNDogYWRtaW5bY1swXSwgRkxBR10gPSB0b19pbnQoY1szXSk7CisgIGNhc2UgMzogYWRtaW5bY1swXSwgU0VORF0gPSB0b19pbnQoY1syXSk7CisgIGNhc2UgMjogYWRtaW5bY1swXSwgUkVDVl0gPSB0b19pbnQoY1sxXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMDoKKyAgZGVmYXVsdDoKKyAgICByZXR1cm47CisgIH0KKyAgc3dpdGNoKG5ldyhjWzBdLCBtLCBkKSkKKyAgeworICBjYXNlIEVfQUNDRVNTX0RFTklFRDoKKyAgICBsb2dfZmlsZSgiQ0hBTk5FTCIsIHNwcmludGYoIlslc10gJXM6ICVPOiBlcnJvciwgYWNjZXNzIGRlbmllZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIGNbMF0sIG0pKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorICByZXR1cm47Cit9CisKK3ZvaWQgaW5pdGlhbGl6ZSgpCit7CisgIG1peGVkIHRtcDsKKyAgdG1wID0gcmVhZF9maWxlKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpKyIuaW5pdCIpOworICB0bXAgPSByZWdleHAob2xkX2V4cGxvZGUodG1wLCAiXG4iKSwgIl5bXiNdIik7CisgIHRtcCA9IG1hcCh0bXAsICMncmVnZXhwbG9kZS8qJyovLCAiW146XVteOl0qJHxbIFxcdF0qOlsgXFx0XSoiKTsKKyAgdG1wID0gbWFwKHRtcCwgIydyZWdleHAvKicqLywgIl5bXjogXFx0XSIpOworICBtYXAodG1wLCAjJ3NldHVwLyonKi8pOworfQorCisvLyBCRUdJTiBPRiBUSEUgQ0hBTk5FTCBNQVNURVIgSU1QTEVNRU5UQVRJT04KKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgcmVzdG9yZV9vYmplY3QoQ0hBTk5FTF9TQVZFKTsKKyAgaWYoIWNoYW5uZWxDKSBjaGFubmVsQyA9IChbXSk7CisgIGlmKCFjaGFubmVsQikgY2hhbm5lbEIgPSAoW10pOworICBjaGFubmVscyA9IChbXSk7CisKKyAgLyogRGllIENoYW5uZWwtSGlzdG9yeSB3aXJkIG5pY2h0IG51ciBsb2thbCBzb25kZXJuIGF1Y2ggbm9jaCBpbSBNZW1vcnkgCisgICAgIGdlc3BlaWNoZXJ0LCBkYWR1cmNoIGJsZWlidCBzaWUgYXVjaCB1ZWJlciBlaW4gUmVsb2FkIGVyaGFsdGVuLiAKKyAgICAgRGVyIGZvbGdlbmRlIENvZGUgdmVyc3VjaHQsIGRlbiBaZWlnZXIgYXVzIGRlbSBNZW1vcnkgenUgaG9sZW4uIEZhbGxzCisgICAgIGRhcyBuaWNodCBtb2VnbGljaCBpc3QsIHdpcmQgZWluIG5ldWVyIGVyemV1Z3QgdW5kIGdlZ2ViZW5lbmZhbGxzIGltCisgICAgIE1lbW9yeSBhYmdlbGVndC4gKi8KKworICAvLyBIYWIgaWNoIGRpZSBub2V0aWdlbiBSZWNodGUgaW0gTWVtb3J5PworICBpZiAoY2FsbF9vdGhlcihNRU1PUlksIkhhdmVSaWdodHMiKSkgeworICAgIC8vIE9iamVrdHBvaW50ZXIgbGFkZW4KKyAgICBjaGFubmVsSCA9IChtaXhlZCkgY2FsbF9vdGhlcihNRU1PUlksIkxvYWQiLCJIaXN0b3J5Iik7CisKKyAgICAvLyBXZW5ucyBuaWNoIGdla2xhcHB0IGhhdCwgaGF0IGRlciBNZW1vcnkgbm9jaCBrZWluZW4gWmVpZ2VyLCBkYW5uCisgICAgaWYgKCFtYXBwaW5ncChjaGFubmVsSCkpeworICAgICAgLy8gWmVpZ2VyIGVyemV1Z2VuCisgICAgICBjaGFubmVsSCA9IChbXSk7CisgICAgICAvLyB1bmQgaW4gZGVuIE1lbW9yeSBzY2hyZWliZW4KKyAgICAgIGNhbGxfb3RoZXIoTUVNT1JZLCJTYXZlIiwiSGlzdG9yeSIsY2hhbm5lbEgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBLZWluZSBSZWNodGUgaW0gTWVtb3J5LCBkYW5uIHdpcmQgbWl0IGVpbmVtIGxva2FsZW4gWmVpZ2VyIGdlYXJiZWl0ZXQuCisgICAgY2hhbm5lbEggPSAoW10pOworICB9CisKKyAgc3RhdHMgPSAoWyJ0aW1lIjogdGltZSgpLAorICAgICAgICAgICAgImJvb3QiOiBjYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSl8fCI8VW5iZWthbm50PiIpXSk7CisgIG5ldyhDTU5BTUUsIHRoaXNfb2JqZWN0KCksICJaZW50cmFsZSBJbmZvcm1hdGlvbmVuIHp1IGRlbiBFYmVuZW4iKTsKKyAgaW5pdGlhbGl6ZSgpOworICBtYXBfb2JqZWN0cyhlZnVuOjp1c2VycygpLCAiUmVnaXN0ZXJDaGFubmVscyIpOworICB0aGlzX29iamVjdCgpLT5zZW5kKENNTkFNRSwgdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlZCBFYmVuZW4gbWl0ICVkIFRlaWxuZWhtZXJuIGluaXRpYWxpc2llcnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFubmVscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudFVzZXIoY2hhbm5lbHMpKSk7Cit9CisKKy8vIHJlc2V0KCkgYW5kIGNhY2hlX3RvKCkgLSBDYWNoZSBUaW1lb3V0LCByZW1vdmUgdGltZWQgb3V0IGNhY2hlZCBjaGFubmVscworLy8gU0VFOiBuZXcsIHNlbmQKK3ByaXZhdGUgaW50IGNhY2hlX3RvKHN0cmluZyBrZXksIG1hcHBpbmcgbSwgaW50IHQpCit7CisgIGlmKCFwb2ludGVycChtW2tleV0pIHx8IG1ba2V5XVsyXSArIDQzMjAwID4gdCkgcmV0dXJuIDE7CisgIHJldHVybigwKTsKK30KKwordmFyYXJncyB2b2lkIHJlc2V0KGludCBub25zdGQpCit7CisgIGNoYW5uZWxDID0gZmlsdGVyX2luZGljZXMoY2hhbm5lbEMsICMnY2FjaGVfdG8vKicqLywgY2hhbm5lbEMsIHRpbWUoKSk7CisgIGlmIChzYXZlX21lX3Nvb24pCisgIHsKKyAgICBzYXZlX21lX3Nvb249MDsKKyAgICBzYXZlX29iamVjdChDSEFOTkVMX1NBVkUpOworICB9Cit9CisKKy8vIG5hbWUoKSAtIGRlZmluZSB0aGUgbmFtZSBvZiB0aGlzIG9iamVjdC4KK3N0cmluZyBuYW1lKCkgeyByZXR1cm4gQ01OQU1FOyB9CitzdHJpbmcgTmFtZSgpIHsgcmV0dXJuIENNTkFNRTsgfQorCisvLyBhY2Nlc3MoKSAtIGNoZWNrIGFjY2VzcyBieSBsb29raW5nIGZvciB0aGUgcmlnaHQgYXJndW1lbnQgdHlwZXMgYW5kCisvLyAgICAgICAgICAgIGNhbGxpbmcgYWNjZXNzIGNsb3N1cmVzIHJlc3BlY3RpdmVseQorLy8gU0VFOiBuZXcsIGpvaW4sIGxlYXZlLCBzZW5kLCBsaXN0LCB1c2VycworLy8gTm90ZTogPHBsPiBpcyB1c3VhbGx5IGFuIG9iamVjdCwgb25seSB0aGUgbWFzdGVyIHN1cHBsaWVzIGEgc3RyaW5nIGR1cmluZworLy8gICAgICAgcnVudGltZSBlcnJvciBoYW5kbGluZy4KK3ZhcmFyZ3MgcHJpdmF0ZSBpbnQgYWNjZXNzKG1peGVkIGNoLCBtaXhlZCBwbCwgc3RyaW5nIGNtZCwgc3RyaW5nIHR4dCkKK3sKKyAgbWl4ZWQgY28sIG07CisKKyAgaWYoIXN0cmluZ3AoY2gpIHx8ICFzaXplb2YoY2ggPSBsb3dlcl9jYXNlKGNoKSkgfHwgIWNoYW5uZWxzW2NoXSkKKyAgICByZXR1cm4gMDsKKyAgaWYoIWNoYW5uZWxzW2NoXVtJX0FDQ0VTU118fCFwcmV2aW91c19vYmplY3QoMSl8fCFleHRlcm5fY2FsbCgpfHwKKyAgICAgcHJldmlvdXNfb2JqZWN0KDEpPT10aGlzX29iamVjdCgpfHwKKyAgICAgKHN0cmluZ3AoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSkmJgorICAgICAgcHJldmlvdXNfb2JqZWN0KDEpPT1maW5kX29iamVjdChjaGFubmVsc1tjaF1bSV9NQVNURVJdKSl8fAorICAgICBnZXR1aWQocHJldmlvdXNfb2JqZWN0KDEpKSA9PSBST09USUQpCisgICAgcmV0dXJuIDI7CisgIGlmKCFvYmplY3RwKHBsKSB8fCAKKyAgICAgKChwcmV2aW91c19vYmplY3QoMSkhPXBsKSAmJihwcmV2aW91c19vYmplY3QoMSkhPXRoaXNfb2JqZWN0KCkpKSkgCisgICAgIHJldHVybiAwOworICAgaWYocG9pbnRlcnAoY2hhbm5lbEJbZ2V0dWlkKHBsKV0pICYmCisgICAgIG1lbWJlcihjaGFubmVsQltnZXR1aWQocGwpXSwgY21kKSAhPSAtMSkKKyAgICByZXR1cm4gMDsKKyAgIGlmKHN0cmluZ3AoY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSkgJiYKKyAgICAgKCEobSA9IGZpbmRfb2JqZWN0KGNoYW5uZWxzW2NoXVtJX01BU1RFUl0pKSB8fAorICAgICAgKCF0b19vYmplY3QoY2hhbm5lbHNbY2hdW0lfQUNDRVNTXSkgfHwKKyAgICAgICBnZXRfdHlwZV9pbmZvKGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10pWzFdKSkpCisgIHsKKyAgICBzdHJpbmcgZXJyOworICAgIGlmKCFvYmplY3RwKG0pKSBlcnIgPSBjYXRjaChsb2FkX29iamVjdChjaGFubmVsc1tjaF1bSV9NQVNURVJdKTtwdWJsaXNoKTsKKyAgICBpZighZXJyICYmCisgICAgICAgKCghdG9fb2JqZWN0KGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10pIHx8CisgICAgICAgICBnZXRfdHlwZV9pbmZvKGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10pWzFdKSAmJgorICAgICAgICAhY2xvc3VyZXAoY2hhbm5lbHNbY2hdW0lfQUNDRVNTXSA9CisgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oImNoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX29iamVjdChjaGFubmVsc1tjaF1bSV9NQVNURVJdKSkpKSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiQ0hBTk5FTCIsIHNwcmludGYoIlslc10gJU8gLT4gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpKTsKKyAgICAgIGNoYW5uZWxzID0gbV9jb3B5X2RlbGV0ZShjaGFubmVscywgY2gpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRoaXNfb2JqZWN0KCktPmpvaW4oY2gsIGZpbmRfb2JqZWN0KGNoYW5uZWxzW2NoXVtJX01BU1RFUl0pKTsKKyAgfQorICBpZihjbG9zdXJlcChjaGFubmVsc1tjaF1bSV9BQ0NFU1NdKSkKKyAgICAgIHJldHVybiBmdW5jYWxsKGNoYW5uZWxzW2NoXVtJX0FDQ0VTU10sCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsc1tjaF1bSV9OQU1FXSwgcGwsIGNtZCwgJnR4dCk7Cit9CisKKy8vIG5ldygpIC0gY3JlYXRlIGEgbmV3IGNoYW5uZWwKKy8vICAgICAgICAgYSBjaGFubmVsIHdpdGggbmFtZSAnY2gnIGlzIGNyZWF0ZWQsIHRoZSBwbGF5ZXIgaXMgdGhlIG1hc3RlcgorLy8gICAgICAgICBpbmZvIG1heSBjb250YWluIGEgc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2hhbm5lbCBvciBhIGNsb3N1cmUKKy8vICAgICAgICAgdG8gZGlzcGxheSB1cC10by1kYXRlIGluZm9ybWF0aW9uLCBjaGVjayBtYXkgY29udGFpbiBhIGNsb3N1cmUKKy8vICAgICAgICAgY2FsbGVkIHdoZW4gYSBqb2luL2xlYXZlL3NlbmQvbGlzdC91c2VycyBtZXNzYWdlIGlzIHJlY2VpdmVkCisvLyBTRUU6IGFjY2VzcworCisjZGVmaW5lIElHTk9SRSAgIl4veHgiCisKK3ZhcmFyZ3MgaW50IG5ldyhzdHJpbmcgY2gsIG9iamVjdCBwbCwgbWl4ZWQgaW5mbykKK3sKKyAgbWl4ZWQgcGxzOworCisgIGlmKCFvYmplY3RwKHBsKSB8fCAhc3RyaW5ncChjaCkgfHwgIXNpemVvZihjaCkgfHwgY2hhbm5lbHNbbG93ZXJfY2FzZShjaCldIHx8CisgICAgIChwbCA9PSB0aGlzX29iamVjdCgpICYmIGV4dGVybl9jYWxsKCkpIHx8CisgICAgIHNpemVvZihjaGFubmVscykgPj0gTUFYX0NIQU5ORUxTIHx8CisgICAgIHNpemVvZihyZWdleHAoKHsgb2JqZWN0X25hbWUocGwpIH0pLCBJR05PUkUpKSB8fAorICAgICAocG9pbnRlcnAoY2hhbm5lbEJbZ2V0dWlkKHBsKV0pICYmCisgICAgICBtZW1iZXIoY2hhbm5lbEJbZ2V0dWlkKHBsKV0sIENfTkVXKSAhPSAtMSkpCisgICAgcmV0dXJuIEVfQUNDRVNTX0RFTklFRDsKKworICBpZighaW5mbykgeworICAgIGlmKGNoYW5uZWxDW2xvd2VyX2Nhc2UoY2gpXSkgeworICAgICAgY2ggPSBjaGFubmVsQ1tsb3dlcl9jYXNlKGNoKV1bMF07CisgICAgICBpbmZvID0gY2hhbm5lbENbbG93ZXJfY2FzZShjaCldWzFdOworICAgIH0KKyAgICBlbHNlIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisgIH0KKyAgZWxzZSBjaGFubmVsQ1tsb3dlcl9jYXNlKGNoKV0gPSAoeyBjaCwgaW5mbywgdGltZSgpIH0pOworCisgIHBscyA9ICh7IHBsIH0pOworCisgIGNoYW5uZWxzW2xvd2VyX2Nhc2UoY2gpXSA9ICh7IHBscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCJjaGVjayIsIHBsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2NoZWNrLyonKi8sIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghbGl2aW5nKHBsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNsb25lcChwbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsICE9IHRoaXNfb2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb2JqZWN0X25hbWUocGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAvLyBDaGFubmVsSCBmdWVyIGVpbmVuIEthbmFsIG51ciBkYW5uIGluaXRpYWxpc2llcmVuLCB3ZW5uIGVzIHNpZSBub2NoIG5pY2ggZ2lidC4KKyAgaWYgKCAhcG9pbnRlcnAoY2hhbm5lbEhbbG93ZXJfY2FzZShjaCldKSApCisgICAgICAgICBjaGFubmVsSFtsb3dlcl9jYXNlKGNoKV0gPSAoe30pOworCisgIGlmKHBsICE9IHRoaXNfb2JqZWN0KCkpCisgICAgbG9nX2ZpbGUoIkNIQU5ORUwubmV3Iiwgc3ByaW50ZigiWyVzXSAlTzogJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBjaCwgcGwsIGluZm8pKTsKKyAgaWYoIXBsLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgdGhpc19vYmplY3QoKS0+c2VuZChDTU5BTUUsIHBsLAorICAgICAgICAgICAgICAgICAgICAgICAgImxhZXNzdCBkaWUgRWJlbmUgJyIrY2grIicgZW50c3RlaGVuLiIsIE1TR19FTU9URSk7CisgIHN0YXRzWyJuZXciXSsrOworIAorICBzYXZlX21lX3Nvb249MTsKKyAgcmV0dXJuKDApOworfQorCisvLyBqb2luKCkgLSBqb2luIGEgY2hhbm5lbAorLy8gICAgICAgICAgdGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgcGxheWVyICdwbCcgaXMgYWxsb3dlZCB0byBqb2luCisvLyAgICAgICAgICB0aGUgY2hhbm5lbCAnY2gnIGFuZCBhZGQgaWYgc3VjY2Vzc2Z1bCwgb25lIGNhbm5vdCBqb2luIGEgY2hhbm5lbAorLy8gICAgICAgICAgdHdpY2UKKy8vIFNFRTogbGVhdmUsIGFjY2VzcworaW50IGpvaW4oc3RyaW5nIGNoLCBvYmplY3QgcGwpCit7CisgIGlmKCFmdW5jYWxsKCMnYWNjZXNzLCZjaCwgcGwsIENfSk9JTikpIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisgIGlmKG1lbWJlcihjaGFubmVsc1tjaF1bSV9NRU1CRVJdLCBwbCkgIT0gLTEpIHJldHVybiBFX0FMUkVBRFlfSk9JTkVEOworICBjaGFubmVsc1tjaF1bSV9NRU1CRVJdICs9ICh7IHBsIH0pOworICByZXR1cm4oMCk7Cit9CisKKy8vIGxlYXZlKCkgLSBsZWF2ZSBhIGNoYW5uZWwKKy8vICAgICAgICAgICB0aGUgYWNjZXNzIGNoZWNrIGluIHRoaXMgZnVuY3Rpb24gaXMganVzdCB0aGVyZSBmb3IgY29tcGxldGVuZXNzCisvLyAgICAgICAgICAgb25lIHNob3VsZCBhbHdheXMgYmUgYWxsb3dlZCB0byBsZWF2ZSBhIGNoYW5uZWwuCisvLyAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIHBsYXllcnMgbGVmdCBvbiB0aGUgY2hhbm5lbCBpdCB3aWxsIHZhbmlzaCwgdW5sZXNzCisvLyAgICAgICAgICAgaXRzIG1hc3RlciBpcyB0aGlzIG9iamVjdC4KKy8vIFNFRTogam9pbiwgYWNjZXNzCitpbnQgbGVhdmUoc3RyaW5nIGNoLCBvYmplY3QgcGwpCit7CisgIGludCBwb3M7CisgIGlmKCFmdW5jYWxsKCMnYWNjZXNzLCZjaCwgcGwsIENfTEVBVkUpKSByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICBjaGFubmVsc1tjaF1bSV9NRU1CRVJdIC09ICh7MH0pOyAvLyBrYXB1dHRlIE9iamVrdGUgZXJzdG1hbCByYXVzCisgIGlmKChwb3MgPSBtZW1iZXIoY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSwgcGwpKSA9PSAtMSkgcmV0dXJuIEVfTk9UX01FTUJFUjsKKyAgaWYocGwgPT0gY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSAmJiBzaXplb2YoY2hhbm5lbHNbY2hdW0lfTUVNQkVSXSkgPiAxKQorICB7CisgICAgY2hhbm5lbHNbY2hdW0lfTUFTVEVSXSA9IGNoYW5uZWxzW2NoXVtJX01FTUJFUl1bMV07CisgICAgaWYoIXBsLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgICB0aGlzX29iamVjdCgpLT5zZW5kKGNoLCBwbCwgInVlYmVyZ2lidCBkaWUgRWJlbmUgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICArY2hhbm5lbHNbY2hdW0lfTUFTVEVSXS0+bmFtZShXRU4pKyIuIiwgTVNHX0VNT1RFKTsKKyAgfQorICBjaGFubmVsc1tjaF1bSV9NRU1CRVJdW3Bvcy4ucG9zXSA9ICh7IH0pOworCisKKyAgaWYoIXNpemVvZihjaGFubmVsc1tjaF1bSV9NRU1CRVJdKSAmJgorICAgICAhc3RyaW5ncChjaGFubmVsc1tjaF1bSV9NQVNURVJdKSkKKyAgeworICAgIC8vIGRlbGV0ZSB0aGUgY2hhbm5lbCB0aGF0IGhhcyBubyBtZW1iZXJzCisgICAgaWYoIXBsLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgICB0aGlzX29iamVjdCgpLT5zZW5kKENNTkFNRSwgcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJsYWVzc3QgYWxzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyhwbC0+UXVlcnlQcm9wKFBfR0VOREVSKSA9PSAxID8gIkxldHp0ZXIiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGV0enRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgZGllIEViZW5lICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICtjaGFubmVsc1tjaF1bSV9OQU1FXQorICAgICAgICAgICAgICAgICAgICAgICAgICArIicsIHdvcmF1ZiBkaWVzZSBzaWNoIGluIGVpbmVtIEJsaXR6IG9rdGFyaW5lbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsiTGljaHRzIGF1ZmxvZXN0LiIsIE1TR19FTU9URSk7CisgICAgY2hhbm5lbENbbG93ZXJfY2FzZShjaCldID0gKHsgY2hhbm5lbHNbY2hdW0lfTkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbY2hdW0lfSU5GT10sIHRpbWUoKSB9KTsKKyAgICBtX2RlbGV0ZShjaGFubmVscywgbG93ZXJfY2FzZShjaCkpOworCisgICAgLy8gV2lyZCBlaW4gQ2hhbm5lbCBlbnRmZXJudCwgd2lyZCBhdWNoIHNlaW5lIEhpc3RvcnkgZ2Vsb2VzY2h0CisgICAgY2hhbm5lbEggPSBtX2NvcHlfZGVsZXRlKGNoYW5uZWxILCBsb3dlcl9jYXNlKGNoKSk7CisKKyAgICBzdGF0c1siZGlzcG9zZSJdKys7CisgICAgc2F2ZV9tZV9zb29uPTE7CisgIH0KKyAgcmV0dXJuKDApOworfQorCisvLyBzZW5kKCkgLSBzZW5kIGEgbWVzc2FnZSB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgJ2NoJworLy8gICAgICAgICAgY2hlY2tzIGlmICdwbCcgaXMgYWxsb3dlZCB0byBzZW5kIGEgbWVzc2FnZSBhbmQgc2VuZHMgaWYgc3VjY2Vzcy0KKy8vICAgICAgICAgIGZ1bCBhIG1lc3NhZ2Ugd2l0aCB0eXBlICd0eXBlJworLy8gICAgICAgICAgJ3BsJyBtdXN0IGJlIGFuIG9iamVjdCwgdGhlIG1lc3NhZ2UgaXMgYXR0cmlidXRlZCB0byBpdC4gZS5nLgorLy8gICAgICAgICAgICBpZ25vcmUgY2hlY2tzIHVzZSBpdC4gSXQgY2FuIGJlICE9IHByZXZpb3VzX29iamVjdCgpCisvLyBTRUU6IGFjY2VzcywgY2guaAordmFyYXJncyBpbnQgc2VuZChzdHJpbmcgY2gsIG9iamVjdCBwbCwgc3RyaW5nIG1zZywgaW50IHR5cGUpCit7CisgIGludCBhOworCisgIGlmKCEoYSA9IGZ1bmNhbGwoIydhY2Nlc3MsJmNoLCBwbCwgQ19TRU5ELCAmbXNnKSkpIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisgIGlmKGEgPCAyICYmIG1lbWJlcihjaGFubmVsc1tjaF1bSV9NRU1CRVJdLCBwbCkgPT0gLTEpIHJldHVybiBFX05PVF9NRU1CRVI7CisgIGlmKCFtc2cgfHwgIXN0cmluZ3AobXNnKSB8fCAhc2l6ZW9mKG1zZykpIHJldHVybiBFX0VNUFRZX01FU1NBR0U7CisgIG1hcF9vYmplY3RzKGNoYW5uZWxzW2NoXVtJX01FTUJFUl0sCisgICAgICAgICAgICAgICJDaGFubmVsTWVzc2FnZSIsICh7IGNoYW5uZWxzW2NoXVtJX05BTUVdLCBwbCwgbXNnLCB0eXBlIH0pKTsKKyAgaWYoc2l6ZW9mKGNoYW5uZWxIW2NoXSkgPiBNQVhfSElTVF9TSVpFKQorICAgIGNoYW5uZWxIW2NoXSA9IGNoYW5uZWxIW2NoXVsxLi5dOworICBjaGFubmVsSFtjaF0gKz0gKHsgKHsgY2hhbm5lbHNbY2hdW0lfTkFNRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5ncChwbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IHBsCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAocGwtPlF1ZXJ5UHJvcChQX0lOVklTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIi8oIitjYXBpdGFsaXplKGdldHVpZChwbCkpKyIpJCIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChwbC0+TmFtZShXRVIsIDIpIHx8ICI8VW5iZWthbm50PiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2crIiA8IitzdHJmdGltZSgiJWEsICVIOiVNOiVTIikrIj5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSB9KSB9KTsKKyAgcmV0dXJuKDApOworfQorCisvLyBsaXN0KCkgLSBsaXN0IGFsbCBjaGFubmVscywgdGhhdCBhcmUgYXQgbGVhc3QgcmVjZWl2YWJsZSBieSAncGwnCisvLyAgICAgICAgICByZXR1cm5zIGEgbWFwcGluZywKKy8vIFNFRTogYWNjZXNzLCBjaGFubmVscworcHJpdmF0ZSB2b2lkIGNsZWFuKHN0cmluZyBuLCBtaXhlZCBhKSB7IGFbMF0gLT0gKHsgMCB9KTsgfQorbWl4ZWQgbGlzdChvYmplY3QgcGwpCit7CisgIG1hcHBpbmcgY2hzOworICAKKyAgY2hzID0gZmlsdGVyX2luZGljZXMoY2hhbm5lbHMsICMnYWNjZXNzLyonKi8sIHBsLCBDX0xJU1QpOworICB3YWxrX21hcHBpbmcoY2hzLCAjJ2NsZWFuLyonKi8pOworICBpZighc2l6ZW9mKGNocykpIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisgIHJldHVybiBkZWVwX2NvcHkoY2hzKTsKK30KKworLy8gZmluZCgpIC0gZmluZCBhIGNoYW5uZWwgYnkgaXRzIG5hbWUgKG1heSBiZSBwYXJ0aWFsKQorLy8gICAgICAgICAgcmV0dXJucyBhbiBhcnJheSBmb3IgbXVsdGlwbGUgcmVzdWx0cyBhbmQgMCBmb3Igbm8gbWF0Y2hpbmcgbmFtZQorLy8gU0VFOiBhY2Nlc3MKK21peGVkIGZpbmQoc3RyaW5nIGNoLCBvYmplY3QgcGwpCit7CisgIG1peGVkIGNocywgczsKKyAgaWYoc3RyaW5ncChjaCkpIGNoID0gbG93ZXJfY2FzZShjaCk7CisgIGlmKCAhc2l6ZW9mKHJlZ2V4cCgoe2NofSksIl5bPD5hLXowLTkjLV0qJCIpKSApIHJldHVybiAwOyAvLyBSVU0KKyAgaWYoIXNpemVvZihjaHMgPSByZWdleHAobV9pbmRpY2VzKGNoYW5uZWxzKSwgIl4iK2NoKyIkIikpKQorICAgIGNocyA9IHJlZ2V4cChtX2luZGljZXMoY2hhbm5lbHMpLCAiXiIrY2gpOworICBpZigocyA9IHNpemVvZihjaHMpKSA+IDEpCisgICAgaWYoc2l6ZW9mKGNocyA9IGZpbHRlcihjaHMsICMnYWNjZXNzLyonKi8sIHBsLCBDX0ZJTkQpKSA9PSAxKQorICAgICAgcmV0dXJuIGNoYW5uZWxzW2Noc1swXV1bSV9OQU1FXTsKKyAgICBlbHNlIHJldHVybiBjaHM7CisgIHJldHVybiAoKHMgJiYgZnVuY2FsbCgjJ2FjY2VzcyxjaHNbMF0sIHBsLCBDX0ZJTkQpKSA/IGNoYW5uZWxzW2Noc1swXV1bSV9OQU1FXSA6IDApOworfQorCisvLyBoaXN0b3J5KCkgLSBnZXQgdGhlIGhpc3Rvcnkgb2YgYSBjaGFubmVsCisvLyBTRUU6IGFjY2VzcworbWl4ZWQgaGlzdG9yeShzdHJpbmcgY2gsIG9iamVjdCBwbCkKK3sKKyAgaWYoIWZ1bmNhbGwoIydhY2Nlc3MsJmNoLCBwbCwgQ19KT0lOKSkKKyAgICByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICByZXR1cm4gZGVlcF9jb3B5KGNoYW5uZWxIW2NoXSk7Cit9CisKKy8vIHJlbW92ZSAtIHJlbW92ZSBhIGNoYW5uZWwgKHdpcmQgYXVzIGRlciBTaGVsbCBhdWZnZXJ1ZmVuKQorLy8gU0VFOiBuZXcKK21peGVkIHJlbW92ZShzdHJpbmcgY2gsIG9iamVjdCBwbCkKK3sKKyAgbWl4ZWQgbWVtYmVyczsKKworICBpZihwcmV2aW91c19vYmplY3QoKSAhPSB0aGlzX29iamVjdCgpKQorICAgIGlmKCFzdHJpbmdwKGNoKSB8fAorICAgICAgIHBsICE9IHRoaXNfcGxheWVyKCkgfHwgdGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkgfHwKKyAgICAgICB0aGlzX2ludGVyYWN0aXZlKCkgIT0gcHJldmlvdXNfb2JqZWN0KCkgfHwKKyAgICAgICAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgcmV0dXJuIEVfQUNDRVNTX0RFTklFRDsKKworICBpZihjaGFubmVsc1tsb3dlcl9jYXNlKGNoKV0pIHsKKyAgICBjaGFubmVsc1tsb3dlcl9jYXNlKGNoKV1bSV9NRU1CRVJdID0KKyAgICAgICAgZmlsdGVyX29iamVjdHMoY2hhbm5lbHNbbG93ZXJfY2FzZShjaCldW0lfTUVNQkVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5UHJvcCIsIFBfQ0hBTk5FTFMpOworICAgIG1hcChjaGFubmVsc1tsb3dlcl9jYXNlKGNoKV1bSV9NRU1CRVJdLAorICAgICAgICBsYW1iZGEoKHsndS8qJyovfSksICh7IydjYWxsX290aGVyLyonKi8sICd1LCAvKicqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcCIsIFBfQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IyctLyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlci8qJyovLCAndSwgLyonKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlQcm9wIiwgUF9DSEFOTkVMU30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyh7IGxvd2VyX2Nhc2UoY2gpIH0pLyonKi8sfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgICBjaGFubmVscyA9IG1fY29weV9kZWxldGUoY2hhbm5lbHMsIGxvd2VyX2Nhc2UoY2gpKTsKKworICAgIC8vIFdpcmQgZWluIENoYW5uZWwgZW50ZmVybnQsIHdpcmQgYXVjaCBzZWluZSBIaXN0b3J5IGdlbG9lc2NodAorICAgIGlmKCBwb2ludGVycChjaGFubmVsSFtsb3dlcl9jYXNlKGNoKV0gKSkKKyAgICAgY2hhbm5lbEggPSBtX2NvcHlfZGVsZXRlKGNoYW5uZWxILCBsb3dlcl9jYXNlKGNoKSk7CisKKyAgICBzdGF0c1siZGlzcG9zZSJdKys7CisgIH0KKyAgaWYoIWNoYW5uZWxDW2xvd2VyX2Nhc2UoY2gpXSkKKyAgICByZXR1cm4gRV9BQ0NFU1NfREVOSUVEOworICBjaGFubmVsQyA9IG1fY29weV9kZWxldGUoY2hhbm5lbEMsIGxvd2VyX2Nhc2UoY2gpKTsKKyAgc2F2ZV9tZV9zb29uPTE7CisgIHJldHVybigwKTsKK30KKworLy8gV2lyZCBhdXMgZGVyIFNoZWxsIGF1ZmdlcnVmZW4gCittaXhlZCBjbGVhcl9oaXN0b3J5KHN0cmluZyBjaCkKK3sKKyAgbWl4ZWQgbWVtYmVyczsKKyAgLy8gU2ljaGVyaGVpdHNhYmZyYWdlbgorICBpZihwcmV2aW91c19vYmplY3QoKSAhPSB0aGlzX29iamVjdCgpKQorICAgIGlmKCFzdHJpbmdwKGNoKSB8fAorICAgICAgIHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpIHx8CisgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpICE9IHByZXZpb3VzX29iamVjdCgpIHx8CisgICAgICAgIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHJldHVybiBFX0FDQ0VTU19ERU5JRUQ7CisKKyAgLy8gSGlzdG9yeSBkZXMgQ2hhbm5lbHMgbG9lc2NoZW4KKyAgaWYoIHBvaW50ZXJwKGNoYW5uZWxIW2xvd2VyX2Nhc2UoY2gpXSApKQorICAgIGNoYW5uZWxIW2xvd2VyX2Nhc2UoY2gpXT0oe30pOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vY2hhbm5lbGQuaW5pdCBiL3AvZGFlbW9uL2NoYW5uZWxkLmluaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5OWQyZAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2NoYW5uZWxkLmluaXQKQEAgLTAsMCArMSw2NSBAQAorIyBDSEFOTkVMIE1BU1RFUiBJTklUIEZJTEUKKyMgVG8gY3JlYXRlIGEgbmV3IGNoYW5uZWw6CisjIDxuYW1lPjo8cmVjdj46PHNlbmQ+OjxmbGFncz46PGluZm8+OjxtYXN0ZXI+CitBbGxnZW1laW46ICAgMDogMDogMDpBbGxnZW1laW5lIFVudGVyaGFsdHVuZ3NlYmVuZQorQWJlbnRldWVyOiAgIDA6IDA6IDA6RnJhZ2VuIGRpZSBBYmVudGV1ZXIgYmV0cmVmZmVuOgkvc2VjdXJlL3F1ZXN0bWFzdGVyCitHcmF0czoJICAgICAwOiAwOiAwOkdyYXR1bGF0aW9uZW4genUgZ2Vsb2VzdGVuIEFiZW50ZXVlcm4gZXRjCitCZWlsZWlkOiAgICAgMDogMDogMDpCZWlsZWlkc2Jla3VuZHVuZ2VuIGplZ2xpY2hlciBBcnQKK0ZyYXRlcm5pdGFzOiAwOiAwOiAwOkZyYXRlcm5pdGFzIGRvbm8gQXJjaG1hZ29ydW0KK1RvZDogICAgICAgICAwOi0xOiAwOldlciBzdGlyYnQgd2Fubj86L3Jvb20vZGVhdGgvZGVhdGhfcm9vbQorVGRUOiAgICAgICAgIDE1OjE1OjE6VG9kIGRlbiBUZXN0aWVzITovcm9vbS9kZWF0aC9kZWF0aF9yb29tCitNb2VyZGVyOiAgICAgMDotMTogMDpHdWNrIG1hbCB3ZXIgZGEgc3ByaWNodC4uLjoJL3N0ZC9jb3Jwc2UKK1NlaGVyOiAgICAgICAxOiAxOiAxOkRpc2t1c3Npb25zZWJlbmUgZnVlciBTZWhlcgorWlQ6ICAgICAgICAgIDA6IDA6IDA6TnVldHpsaWNoZSBUaXBzIGZ1ZXIgZGllIFphdWJlcnRyYW5rc3VjaGUKKyMKKyMgR3VpbGQgY2hhbm5lbHMKKyMKK0tsZXJ1czogICAgICAwOiAwOiAwOkRpZSBQcmllc3RlcjoJCQkvZ2lsZGVuL2tsZXJ1cworQmllcnNjaHVldHRsZXI6IDA6IDA6IDA6RGllIEJpZXJzY2h1ZXR0bGVyOgkJL2dpbGRlbi9iaWVyc2NodWV0dGxlcgorV2Vyd29lbGZlOiAgIDA6IDA6IDA6RGllIFdlcndvZWxmZTogICAgICAgICAgICAgICAgICAgICAvZ2lsZGVuL3dlcndvZWxmZQorQWJHaWxkZTogICAgIDA6IDA6IDA6QWJlbnRldXJlciwgdW5kIHNvbGNoZSwgZGllIGVzIHdlcmRlbiB3b2xsZW46IC9naWxkZW4vYWJlbnRldXJlcgorWmF1YmVyZXI6ICAgIDA6IDA6IDA6RGllIFphdWJlcmVyOgkJCS9naWxkZW4vemF1YmVyZXIKK1RhbmppYW46ICAgICAwOiAwOiAwOkRpZSBUYW5qaWFuOiAgICAgICAgICAgICAgICAgICAgICAgL2dpbGRlbi90YW5qaWFuCitLYXJhdGU6ICAgICAgMDogMDogMDpEaWUgS2FyYXRla2E6CQkJL2dpbGRlbi9rYXJhdGUKK0NoYW9zOiAgICAgICAwOiAwOiAwOkNoYW90ZW4uLi46CQkJL2dpbGRlbi9jaGFvcworVHJ2ZXM6ICAgICAgIDA6IDA6IDA6TmV1ZXMgdm9tIEtvcnUgVHNjaGFrYXIgU3RydXY6ICAgICAvcC9rYWVtcGZlci9zdGQva19tYXN0ZXIKK01hZ3VzOiAgICAgICAwOiAwOiAwOkRlciBtYWdpc2NoZSBDb252ZW50IHp1IENhc3RhbGxhIFJvc3NvOiAgL2dpbGRlbi9tYWd1cworRHVua2VsZWxmZW46IDA6IDA6IDA6RGllIER1bmtlbGVsZmVuOgkJCS9naWxkZW4vZHVua2VsZWxmZW4KK1VydWstSGFpOiAgICAwOiAwOiAwOkZ1ZXIgZWNodGUgT3JrczoJCQkvZ2lsZGVuL3VydWtoYWkKKyMKKyMgV2l6YXJkIGNoYW5uZWxzCisjCitNYWdpZXI6ICAgICAxNToxNTogMTpEaXNrdXNzaW9uc2ViZW5lIGZ1ZXIgTWFnaWVyCitFcnptYWdpZXI6ICA2MDo2MDogMTpFcnptYWdpZXIKK0dvZXR0ZXI6ICAgMTAwOjEwMDogMTpHb2V0dGVyCitMUEM6ICAgICAgICAxNToxNTogMTpGcmFnZW4genVyIFByb2dyYW1taWVydW5nIHVuZCBMUEMKKyMKK0RlYnVnOiAgICAgIDIwOjYwOiAxOkRlYnVnIHVuZCBGZWhsZXJtZWxkdW5nZW46CQkvcC9kYWVtb24vZGVidWcKK0VudHdpY2tsdW5nOiAyMDo2MDoxOkZlaGxlciBydW5kIHVtIEVpZ2VuZW50d2lja2x1bmdlbjogL3AvZGFlbW9uL2RlYnVnCitXYXJudW5nZW46ICAgMjA6NjA6MTpMYXVmemVpdC1XYXJudW5nZW46CQkvcC9kYWVtb24vZGVidWcKK1Nub29wOiAgICAgIDYwOi0xOiAxOldlciBzbm9vcHQgZGVubiBoaWVyPzoJCS9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuCitGVFA6ICAgICAgICA2MDotMTogMTpXZXIgbWFjaHQgZGVubiBGVFA/OgkJL3NlY3VyZS9iYm1hc3RlcgorIworIyBJbnRlcm11ZCBjaGFubmVscworIworSW50ZXJtdWQ6ICAgIDA6IDU6IDI6SW50ZXJtdWQgY2hhdCAoRW5nbGlzY2gpOgkJL3NlY3VyZS91ZHAvY2hhbm5lbAorSW50ZXJjb2RlOiAgMjA6MjA6IDM6UHJvZ3JhbW1pZXJmcmFnZW4gKEVuZ2xpc2NoKToJL3NlY3VyZS91ZHAvY2hhbm5lbAorSW50ZXJhZG1pbjogNDU6NTU6IDM6QWRtaW5pc3RyYXRpb24gKEVuZ2xpc2NoKToJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtY2hhdDoJICAgICAwOiA1OiAyOlZlcmJpbmRldCBEZXV0c2NoZSBNVURzOgkJL3NlY3VyZS91ZHAvY2hhbm5lbAorRC1saW51eDogICAgIDA6IDU6IDI6TGludXggaW0gRC1DaGF0OiAgICAJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtdHYtYWxsZXM6ICAwOiA1OiAyOkRldXRzY2hlcyBUViBQcm9ncmFtbToJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtbmV3czogICAgICAwOiA1OiAyOkRldXRzY2hlcyBOYWNocmljaHRlbjoJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtY29kZToJICAgIDIwOjIwOiAzOk1VRCBQcm9ncmFtbWllciBGb3J1bToJCS9zZWN1cmUvdWRwL2NoYW5uZWwKK0QtYWRtOiAgICAgIDYwOjYwOiAzOkRldXRzY2hzcHJhY2hpZ2UgQWRtaW5pc3RyYXRpb246CS9zZWN1cmUvdWRwL2NoYW5uZWwKKyMKKyMgc3BlY2lhbAorIworV2lzc2Vuc2NoYWZ0OjA6IDA6IDA6V2lzc2Vuc2NoYWZ0bGljaGUgRGlzcHV0ZQorS3VsdHVyOgkgICAgIDA6IDA6IDA6S3VsdHVyZWxsZSBFcmVpZ25pc3NlIHVuZCBFcmd1ZXNzZQorU3BvcnQ6CSAgICAgMDogMDogMDpTcG9ydCB1bmQgU3BpZWwKK0FuZmFlbmdlcjogICAwOiAwOiAwOkRpZSBFYmVuZSBmdWVyIEFuZmFlbmdlcmZyYWdlbgordHdpdHRlcjogICAgIDA6IDA6IDE6RWluIFZvZ2VsIGltIE11ZD86IC9zZWN1cmUvbWlzYy90d2l0dGVyCisjCisjIEdlYmlldHNwZXppZmlzY2hlcworIworTWV0emVsb3Jha2VsOjA6IDA6IDA6RnVlciBkaWUgTWV0emVsd3VldGlnZW46CQkvZC9lYmVuZS9hcmF0aG9ybi9vcmFrZWwvc2VjdXJlL3NjaGFtYW5lCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9jaGFubmVsZC50cnVzdGVkIGIvcC9kYWVtb24vY2hhbm5lbGQudHJ1c3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE5NjMzCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vY2hhbm5lbGQudHJ1c3RlZApAQCAtMCwwICsxLDEyIEBACisjIENIQU5ORUxEIE1BU1RFUiBUUlVTVEVEIE9CSkVDVFMgRklMRQorIyA8b2JqZWN0PiA6IDxjaGFubmVscz4gOiA8bmFtZT4KKy9zZWN1cmUvbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICA6OgorL3NlY3VyZS91ZHAvY2hhbm5lbCAgICAgICAgICAgICAgICAgIDpJT0FXcVA6Cisvc2VjdXJlL3NpbXVsX2VmdW4gICAgICAgICAgICAgICAgICAgOjoKKy9yb29tL2RlYXRoL2RlYXRoX3Jvb20gICAgICAgICAgICAgICA6VDoKKy9zZWN1cmUvcXVlc3RtYXN0ZXIgICAgICAgICAgICAgICAgICA6YjoKKy9kL2luc2Vsbi9hbnRoZWEvcm9vbS9sYW5kL211ZWhsc3RlaW46VDoKKy9zdGQvY29ycHNlICAgICAgICAgICAgICAgICAgICAgICAgICA6TToKKy9wL2RhZW1vbi9pbmV3cyAgICAgICAgICAgICAgICAgICAgICA6YU5xVzpEVworL2dpbGRlbi9rYXJhdGUgICAgICAgICAgICAgICAgICAgICAgIDpLOgorL2dpbGRlbi9jaGFvcyAgICAgICAgICAgICAgICAgICAgICAgIDpjOgpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vY2xhc3NkYi5jIGIvcC9kYWVtb24vY2xhc3NkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjQwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9jbGFzc2RiLmMKQEAgLTAsMCArMSw5MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIC9vYmovY2xhc3NkLmMgLS0gbWFzdGVyIG9iamVjdCBmb3IgY2xhc3Nlcy4KKy8vCisvLyBTb2xsIGlyZ2VuZHdhbm4gbWFsIEtsYXNzZW4gYWVobmxpY2ggZGVyIE1hdGVyaWFsLURCIHZlcndhbHRlbiwgbW9tZW50YW4KKy8vIG1hY2h0cyBlcyBlcnN0bWFsIGVpbmZhY2ggZWluZSBFcnNldHp1bmcgdm9uIEFsaWFzZW4gdW5kIGVpbiBIaW56dWZ1ZWdlbgorLy8gdm9uIGltcGxpeml0ZW4gS2xhc3Nlbi4KKy8vCisvLyAkSWQkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLCBub19zaGFkb3csIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMsY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljLCByYW5nZV9jaGVjaywgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjbGFzcy5oPgorCisvLyBNYXBwaW5nIHZvbiBBbGlhc2VuIGZ1ZXIgS2xhc3Nlbi4gQWxpYXNlIGR1ZXJmZW4gbmljaHQgcmVrdXJzaXYgc2Vpbi4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgY2xhc3NhbGlhc2VzID0KKyAgKFsKKyAgIF0pOworLy8gTWFwcGluZyB2b24gaW1wbGl6aXRlbiBLbGFzc2VuIGZ1ZXIgZWluZSBnZWdlYmVuZSBLbGFzc2UuIEltcGxpeml0ZSBLbGFzc2VuCisvLyBzaW5kIGFscyBBcnJheSB2b24gS2xhc3Nlbm5hbWVuIGdlZ2ViZW4uIEltcGxpeml0ZSBLbGFzc2VuIGR1ZXJmZW4genVyIFplaXQKKy8vIG5pY2h0IHJla3Vyc2l2IHNlaW4gdW5kIGtlaW5lIEFsaWFzZSBlbnRoYWx0ZW4uCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGltcGxpY2l0Y2xhc3NlcyA9CisgIChbCisgICAgIENMX1pPTUJJRTogICAgICAgKHtDTF9VTkRFQUR9KSwKKyAgICAgQ0xfU0tFTEVUT046ICAgICAoe0NMX1VOREVBRH0pLAorICAgICBDTF9HSE9VTDogICAgICAgICh7Q0xfVU5ERUFEfSksCisgICAgIENMX1ZBTVBJUkU6ICAgICAgKHtDTF9VTkRFQUR9KSwKKyAgICAgQ0xfSE9CR09CTElOOiAgICAoe0NMX0dPQkxJTn0pLAorICAgICBDTF9NQU1NQUxfTEFORDogICh7Q0xfTUFNTUFMLCBDTF9BTklNQUx9KSwKKyAgICAgQ0xfTUFNTUFMX1dBVEVSOiAoe0NMX01BTU1BTCwgQ0xfQU5JTUFMfSksCisgICAgIENMX1NOQUtFOiAgICAgICAgKHtDTF9SRVBUSUxFfSksCisgICAgIENMX0FSQUNITklEOiAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfQklSRDogICAgICAgICAoe0NMX0FOSU1BTH0pLAorICAgICBDTF9GSVNIOiAgICAgICAgICh7Q0xfQU5JTUFMfSksCisgICAgIENMX0ZST0c6ICAgICAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfSU5TRUNUOiAgICAgICAoe0NMX0FOSU1BTH0pLAorICAgICBDTF9NQU1NQUw6ICAgICAgICh7Q0xfQU5JTUFMfSksCisgICAgIENMX1JFUFRJTEU6ICAgICAgKHtDTF9BTklNQUx9KSwKKyAgICAgQ0xfU05BS0U6ICAgICAgICAoe0NMX0FOSU1BTH0pLAorICAgICBDTF9HT0xFTTogICAgICAgICh7Q0xfQ09OU1RSVUNUfSksCisgICBdKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworfQorCisvKiogR2lidCBkZW4gQWxpYXMgZGVyIEtsYXNzZSA8Y2xzPiB6dXJ1ZWNrLgorICogQHBhcmFtW2luXSBjbHMgc3RyaW5nIC0gS2xhc3Nlbm5hbWUKKyAqIEByZXR1cm4gc3RyaW5nKiAtIEFsaWFzIHZvbiBLbGFzc2UgPGNscz4KKyAqLworcHVibGljIHN0cmluZyAqIFF1ZXJ5Q2xhc3NBbGlhcyhzdHJpbmcgY2xzKSB7CisgIGlmICghc3RyaW5ncChjbHMpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICJHb3Qgd3JvbmcgYXJndW1lbnQsIGV4cGVjdGVkIHN0cmluZywgZ290ICUuNTBPXG4iLGNscykpOworICByZXR1cm4gY29weShjbGFzc2FsaWFzZXNbY2xzXSkgfHwgY2xzOworfQorCisvKiogR2lidCBkaWUgaW1wbGl6aXRlbiBLbGFzc2VuIGRlciBLbGFzc2UgPGNscz4genVydWVjay4KKyAqIEBwYXJhbVtpbl0gY2xzIHN0cmluZyAtIEtsYXNzZW5uYW1lCisgKiBAcmV0dXJuIHN0cmluZyogLSBMaXN0ZSB2b24gaW1wbGl6aXRlbiBLbGFzc2VuIHZvbiA8Y2xzPgorICovCitwdWJsaWMgc3RyaW5nICogUXVlcnlJbXBsaWNpdENsYXNzZXMoc3RyaW5nIGNscykgeworICBpZiAoIXN0cmluZ3AoY2xzKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAgICAiR290IHdyb25nIGFyZ3VtZW50LCBleHBlY3RlZCBzdHJpbmcsIGdvdCAlLjUwT1xuIiwgY2xzKSk7CisgIHJldHVybiBjb3B5KGltcGxpY2l0Y2xhc3Nlc1tjbHNdKSB8fCAoe30pOworfQorCisvKiogQWRkcyBpbXBsaWNpdCBjbGFzc2VzIHRvIHRoZSBjbGFzc2VzIGdpdmVuIGluIDxjbGFzc2VzPi4KKyAqIEF1c3NlcmRlbSB3ZXJkZW4gS2xhc3NlbmFsaWFzZSBhdWZnZWxvZXN0LgorICogQHBhcmFtW2luXSBjbGFzc2VzIHN0cmluZyogLSBLbGFzc2VubGlzdGUuCisgKiBAcmV0dXJuIHN0cmluZyogLSBuZXVlIEtsYXNzZW5saXN0ZQorICogQGF0dGVudGlvbiBLYW5uIGRhcyB1ZWJlcmdlYmVuZSBBcnJheSBhZW5kZXJuLiBEYXMgRXJnZWJuaXNhcnJheSBtdXNzIG5pY2h0CisgKiB1bmlxdWUgc2Vpbiwgc29uZGVybiBrYW5uIER1YmxldHRlbiBlbnRoYWx0ZW4uCisgKi8KK3B1YmxpYyBzdHJpbmcgKiBBZGRJbXBsaWNpdENsYXNzZXMoc3RyaW5nICpjbGFzc2VzKSB7CisgIGlmICghcG9pbnRlcnAoY2xhc3NlcykpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICJHb3Qgd3JvbmcgYXJndW1lbnQsIGV4cGVjdGVkIGFycmF5LCBnb3QgJS41ME9cbiIsY2xhc3NlcykpOworICBmb3JlYWNoKHN0cmluZyBjbHMgOiAmY2xhc3NlcykgeworICAgICAgLy8genVlcnN0IEFsaWFzZSBlcnNldHplbgorICAgICAgaWYgKG1lbWJlcihjbGFzc2FsaWFzZXMsIGNscykpCisgICAgICAgICAgY2xzID0gY2xhc3NhbGlhc2VzW2Nsc107CisgICAgICAvLyBkYW5uIGltcGxpeml0ZSBLbGFzc2VuIGFkZGllcmVuLgorICAgICAgaWYgKG1lbWJlcihpbXBsaWNpdGNsYXNzZXMsIGNscykpCisgICAgICAgICAgY2xhc3NlcyArPSBpbXBsaWNpdGNsYXNzZXNbY2xzXTsKKyAgfQorICByZXR1cm4gY2xhc3NlczsKK30KKwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vZGVidWcuYyBiL3AvZGFlbW9uL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkNjk3NQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2RlYnVnLmMKQEAgLTAsMCArMSwxMjggQEAKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKworc3RhdGljIGludCBkX3N0YXJ0LCBkX2VuZCwgZV9zdGFydCwgZV9lbmQ7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7ICAgIAorICAgIGRfZW5kID0gZF9zdGFydCA9IGVfZW5kID0gZV9zdGFydCA9IGZpbGVfc2l6ZShfX0RFQlVHX0xPR19fKTsKK30KKworaW50IGNoZWNrKCBzdHJpbmcgY2gsIG9iamVjdCBwbCwgc3RyaW5nIGNtZCwgc3RyaW5nIHR4dCApCit7CisgICAgbWl4ZWQgdG1wOworICAgIAorICAgIGlmICggY2ggIT0gIkRlYnVnIiAmJiBjaCAhPSAiRW50d2lja2x1bmciICYmIGNoICE9ICJXYXJudW5nZW4iICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgaWYoIG9iamVjdHAocGwpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpICYmIHF1ZXJ5X3dpel9sZXZlbChwbCkgPiAxNSApCisgICAgICAgIHN3aXRjaChjbWQpeworICAgICAgICBjYXNlIENfRklORDoKKyAgICAgICAgY2FzZSBDX0xJU1Q6CisgICAgICAgIGNhc2UgQ19KT0lOOgorICAgICAgICBjYXNlIENfTEVBVkU6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBDX1NFTkQ6CisgICAgICAgICAgICAvLyBXZXIgKG5vY2gpIG5pY2h0IGF1ZiBkZW0gS2FuYWwgaXN0LCBiZWtvbW10IGF1Y2gga2VpbmUKKyAgICAgICAgICAgIC8vIEF1c2dhYmUgLSBzb25zdCBnaWJ0IGVzIHNlbGJpZ2UgZG9wcGVsdCwgZGEgZGVyIENITUFTVEVSCisgICAgICAgICAgICAvLyBlaW5lbiBhdXRvbWF0aXNjaCBkZW4gS2FuYWwgYmV0cmV0ZW4gbGFlc3N0IC4uLgorICAgICAgICAgICAgaWYgKCAhb2JqZWN0cChwbCkgfHwgIXBvaW50ZXJwKHRtcD0obWl4ZWQpcGwtPlF1ZXJ5UHJvcChQX0NIQU5ORUxTKSkgfHwKKyAgICAgICAgICAgICAgICAgbWVtYmVyKCB0bXAsIGxvd2VyX2Nhc2UoY2gpICkgPT0gLTEgKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICBzd2l0Y2goIGxvd2VyX2Nhc2UodHh0KSApeworICAgICAgICAgICAgY2FzZSAiYmFja3RyYWNlIjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBidCwgbG9nOworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICggY2ggPT0gIkRlYnVnIiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGRfZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICJFbnR3aWNrbHVuZyIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZV9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVfZW5kOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBlbHNlIGlmIChjaCA9PSAiV2FybnVuZ2VuIikgeworCQkJcGwtPk1lc3NhZ2UoICJbIiArIGNoICsgIjpdIEJhY2t0cmFjZSBmdWVyIFdhcm51bmdlbiAiCisJCQkgICAgIm5pY2h0IHZlcmZ1ZWdiYXIhXG4iKTsKKwkJCXJldHVybiAwOworCQkgICAgfQorCQkgICAgZWxzZSByZXR1cm4oMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnQgPj0gZW5kICkgCisgICAgICAgICAgICAgICAgICAgICAgICBidCA9ICJbIiArIGNoICsgIjpdIEtlaW4gQmFja3RyYWNlIHZlcmZ1ZWdiYXIhXG4iOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyA9IHJlZ3JlcGxhY2UoIHJlYWRfYnl0ZXMoIF9fREVCVUdfTE9HX18sIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuZC1zdGFydD4xMDAwMCk/MTAwMDA6CisJCQkJCQkgICAgICBlbmQgLSBzdGFydCApIHx8ICJcbkZlaGxlciBiZWltIEVpbmxlc2VuIGRlcyBEZWJ1Z2xvZ3M6IEtlaW4gQmFja3RyYWNlIHZlcmZ1ZWdiYXIhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihNaXNwbGFjZWR8Y3VycmVudF9vYmplY3R8IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb258SG9zdClbXlxuXSpcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgYnQgPSAiWyIgKyBjaCArICI6XSAtLSBCQUNLVFJBQ0UgQkVHSU4gLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlsiICsgY2ggKyAiOl0gLS0gQkFDS1RSQUNFIEVORCAtLVxuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9vdXQoIHN5bWJvbF9mdW5jdGlvbiggIk1lc3NhZ2UiLCBwbCApLCAwLCBidCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKwkJaWYgKCBjaCAhPSAiV2FybnVuZ2VuIiApIHsKKwkJICBwbC0+TWVzc2FnZSggIlsiICsgY2ggKyAiOl0gSGlsZmUuLi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlsiICsgY2ggKyAiOl0gRm9sZ2VuZGUgS29tbWFuZG9zIHN0ZWhlbiB6dXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyZnVlZ3VuZzpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlsiICsgY2ggKyAiOl0gJ2JhY2t0cmFjZScgLS0gc2VuZGV0IGRlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNrdHJhY2UgenVtIEZlaGxlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyIgKyBjaCArICI6XSAnaGlsZmUnICAgICAtLSBzZW5kZXQgZGllc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlsZmVzZWl0ZVxuIik7CisJCX0KKwkJZWxzZSB7CisJCSAgcGwtPk1lc3NhZ2UoICJbIiArIGNoICsgIjpdIEtlaW5lIEtvbW1hbmRvcyB2ZXJmdWVnYmFyIVxuIik7CisJCX0KKyAgICAgICAgICAgIH0KKwl9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBuYW1lKCkgeyByZXR1cm4gIjxEZWJ1Z2dlcj4iOyB9CitzdHJpbmcgTmFtZSgpIHsgcmV0dXJuICI8RGVidWdnZXI+IjsgfQorCit2b2lkIENoYW5uZWxNZXNzYWdlKCBtaXhlZCBhICkKK3sKKyAgICBpbnQgZnM7CisKKyAgICBmcyA9IGZpbGVfc2l6ZShfX0RFQlVHX0xPR19fKTsKKyAgICAKKyAgICBzd2l0Y2goIGFbMF0gKXsKKyAgICBjYXNlICJEZWJ1ZyI6CisgICAgICAgIGlmICggIGZzID4gZF9lbmQgJiYgZnMgPiBlX2VuZCApeworCSAgICBkX3N0YXJ0ID0gbWF4KChkX2VuZCA+IGVfZW5kID8gZF9lbmQgOiBlX2VuZCksMCk7CisgICAgICAgICAgICBkX2VuZCA9IGZzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZzIDwgZF9zdGFydCB8fCBmcyA8PSBkX2VuZCkgeworCSAgICAvLyBEZWJ1Z2xvZyB3dXJkZSB3b2hsIG5ldSBnZW9lZmZuZXQuCisJICAgIGRfc3RhcnQgPSBkX2VuZCA9IGVfc3RhcnQgPSBlX2VuZCA9IGZzOworCX0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgIkVudHdpY2tsdW5nIjoKKyAgICAgICAgaWYgKCAgZnMgPiBkX2VuZCAmJiBmcyA+IGVfZW5kICl7CisJICAgIGVfc3RhcnQgPSBtYXgoKGVfZW5kID4gZF9lbmQgPyBlX2VuZCA6IGRfZW5kKSwwKTsKKyAgICAgICAgICAgIGVfZW5kID0gZnM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZnMgPCBlX3N0YXJ0IHx8IGZzIDw9IGVfZW5kKSB7CisJICAgIC8vIERlYnVnbG9nIHd1cmRlIHdvaGwgbmV1IGdlb2VmZm5ldC4KKwkgICAgZF9zdGFydCA9IGRfZW5kID0gZV9zdGFydCA9IGVfZW5kID0gZnM7CisJfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisgCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9kbnNsb29rdXAuYyBiL3AvZGFlbW9uL2Ruc2xvb2t1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTIzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9kbnNsb29rdXAuYwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGRuc2xvb2t1cC5jIC0ga2xlaW5lcyBETlMtTG9va3VwLU9iamVrdCBtaXQgQ2FjaGUuCisvLyAgICAgICAgICAgICAgIEJyYXVjaHQgZXh0ZXJuZW4gRE5TLVJlc29sdmVyLCBkZXIgcGVyIFVEUCBhbnNwcmVjaGJhciBpc3QuCisvLworLy8gQXV0b3I6IFplc3N0cmEKKworLyogSW0gTXVkbGlibWFzdGVyIGluIHJlY2VpdmVfdWRwKCkgYnJhdWNodCBlcyBub2NoIGV0d2FzIGEgbGE6CisgIGlmKCBtZXNzYWdlWzAuLjldPT0iRE5TTE9PS1VQXG4iICkgeworICAgICIvcC9kYWVtb24vZG5zbG9va3VwIi0+dXBkYXRlKCBtZXNzYWdlICk7CisgICAgcmV0dXJuOworICB9CisKKyAgZXh0LiBPYmpla3QgZXJ3YXJ0ZXQgZ2FueiBzaW1wZWwgPGhvc3RuYW1lPlxuIGFscyBFaW5nYWJlIHVuZCBzZW5kZXQgenVydWVjazoKKyAgRE5TTE9PS1VQXG48aG9zdG5hbWU+XG48aXAtYWRyZXNzZT58VU5LTk9XTlxuCisgIChEYXMgfCBzdGVodCBmdWVyIG9kZXIuKQorKi8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcworCisvLyBleHRlcm5lciBzZXJ2ZXIsIGRlciBkZW4gRE5TLVJlc29sdmUgbWFjaHQuCisjZGVmaW5lIElQTE9PS1VQX0hPU1QgIjEyNy4wLjAuMSIKKyNkZWZpbmUgSVBMT09LVVBfUE9SVCA4NzEyCisKK21hcHBpbmcgY2FjaGUgPSAoW10pOworCittYXBwaW5nIF9xdWVyeV9jYWNoZSgpIHtyZXR1cm4gY2FjaGU7fQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgc2V0X25leHRfcmVzZXQoMzYwMCk7Cit9CisKKy8vIGphLi4uIHRvdGFsIHNpbXBlbC4uLiBuaWNodCBtZWhyIGF1ZndhbmQgYWxzIG5vZXRpZy4KK3ZvaWQgcmVzZXQoKQoreworICBjYWNoZSA9IChbXSk7CisgIHNldF9uZXh0X3Jlc2V0KDEwODAwKTsKK30KKworLy8gZWlnZW50bGljaGUgQW5mcmFnZSBhbiBkZW4gZXh0ZXJuZW4gUmVzb2x2ZXIgc2VuZGVuLgorcHJvdGVjdGVkIHZvaWQgbWFrZV9yZXF1ZXN0KHN0cmluZyBob3N0bmFtZSkKK3sKKyAgc2VuZF91ZHAoIElQTE9PS1VQX0hPU1QsIElQTE9PS1VQX1BPUlQsIGhvc3RuYW1lKyJcbiIgKTsKKyAgaWYgKHNpemVvZihjYWNoZSkgPiAxMDAwKQorICAgIHJlc2V0KCk7CisgIGNhY2hlW2hvc3RuYW1lXT0wOyAvLyBjYWNoZWQgcmVxdWVzdCwgYnV0IHVua25vd24gcmVzdWx0ICh5ZXQpCit9CisKKy8vIEhvc3RuYW1lbiBhc3luY2hyb24gYXVmbG9lc2VuLgorcHVibGljIHN0cmluZyByZXNvbHZlKCBzdHJpbmcgaG9zdG5hbWUgKQoreworICBpZiAobWVtYmVyKGNhY2hlLCBob3N0bmFtZSkpCisgICAgcmV0dXJuIGNhY2hlW2hvc3RuYW1lXTsKKyAgbWFrZV9yZXF1ZXN0KCBob3N0bmFtZSApOworICByZXR1cm4gMDsgIC8vIGxlaWRlci4uLgorfQorCisvLyBQcnVlZnVuZywgb2Igdm9uIDxpcD4gVmVyYmluZHVuZ2VuIHp1IHVuc2VyZXIgSVAgbmFjaCA8bG9jYWxwb3J0PgorLy8gd2VpdGVyZ2VsZWl0ZXQgd2VyZGVuLgorcHVibGljIGludCBjaGVja190b3Ioc3RyaW5nIGlwLCBpbnQgbG9jYWxwb3J0KQoreworICBzdHJpbmcgKmFycj1leHBsb2RlKGlwLCIuIik7CisgIGlmICghc2l6ZW9mKGFycik9PTQpCisgICAgcmV0dXJuIDA7CisgIHN0cmluZyByZXEgPQorICAgIHNwcmludGYoIiVzLiVzLiVzLiVzLiVkLjYwLjI0Ljc5Ljg3LmlwLXBvcnQuZXhpdGxpc3QudG9ycHJvamVjdC5vcmciLAorICAgICAgICAgICAgYXJyWzNdLGFyclsyXSxhcnJbMV0sYXJyWzBdLGxvY2FscG9ydCk7CisgIAorICByZXR1cm4gcmVzb2x2ZShyZXEpID09ICIxMjcuMC4wLjIiOworfQorCisvLyBQcnVlZnVuZywgb2IgPGlwPiBhdWYgZWluaWdlbiBCbGFja2xpc3RzIHN0ZWh0LgorcHVibGljIGludCBjaGVja19kbnNibChzdHJpbmcgaXApCit7CisgIHN0cmluZyAqYXJyPWV4cGxvZGUoaXAsIi4iKTsKKyAgaWYgKCFzaXplb2YoYXJyKT09NCkKKyAgICByZXR1cm4gMDsKKyAgc3RyaW5nIHJlcSA9CisgICAgc3ByaW50ZigiJXMuJXMuJXMuJXMuZG5zYmwuZHJvbmVibC5vcmciLAorICAgICAgICAgICAgYXJyWzNdLGFyclsyXSxhcnJbMV0sYXJyWzBdKTsKKyAgCisgIHJldHVybiByZXNvbHZlKHJlcSkgIT0gMDsKK30KKworLyogd2lyZCB2b20gbWFzdGVyIGF1ZmdlcnVmZW4sIHdlbm4gZWluZSBhbnR3b3J0IHZvbSBleHRlcm5lbgorICogaXBsb29rdXAgZGllbnN0IGVpbnRydWRlbHQuCisgKi8KK3B1YmxpYyB2b2lkIHVwZGF0ZSggc3RyaW5nIHVkcF9yZXBseSApCit7CisgIGlmKCBwcmV2aW91c19vYmplY3QoKSE9bWFzdGVyKCkgKSByZXR1cm47CisgIHN0cmluZyAqcmVwbHkgPSBleHBsb2RlKHVkcF9yZXBseSwiXG4iKTsKKyAgaWYoIHNpemVvZihyZXBseSk8MyApIHJldHVybjsKKworICBpZiAocmVwbHlbMl0gPT0gIlVOS05PV04iKQorICAgIGNhY2hlW3JlcGx5WzFdXSA9IDA7CisgIGVsc2UKKyAgICBjYWNoZVtyZXBseVsxXV0gPSByZXBseVsyXTsKK30KKwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vZXZlbnRkLmMgYi9wL2RhZW1vbi9ldmVudGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODFkMzhiCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vZXZlbnRkLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyAvcC9kYWVtb24vZXZlbnRkLmMgLS0gRXZlbnQgRGlzcGF0Y2hlcgorLy8KKy8vICRJZCQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisKKy8vIEZ1ZXIgU3RhdGlzdGlrZW4KKyNkZWZpbmUgU1RBVElTVElDUworCisjZGVmaW5lIEhPTUUoeCkgKF9fUEFUSF9fKDApK3gpCisjZGVmaW5lIFNUT1JFIEhPTUUoInNhdmUvZXZlbnRkIikKKworCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiRVZFTlRTIiwgc3ByaW50ZihcCisgICAgICAiWyVzXSAlc1xuIixkdGltZSh0aW1lKCkpLHgpKQorLy8jZGVmaW5lIExPR0VWRU5UKHgseSx6KSBsb2dfZmlsZSgiRVZFTlRTIiwgc3ByaW50ZihcCisvLyAgICAgICJbJXNdIEV2ZW50ICVzIHRyaWdnZXJlZCBieSAlTyAoQXJnczogJS40ME8pXG4iLGR0aW1lKHRpbWUoKSkseCx5LHopKQorI2RlZmluZSBMT0dFVkVOVCh4LHkseikKKy8vI2RlZmluZSBMT0dSRUdJU1RFUih3LHgseSx6KSBsb2dfZmlsZSgiRVZFTlRMSVNURU5FUiIsc3ByaW50ZihcCisvLyAgICAgICJbJXNdICVPIChGdW46ICUuMjVzKSByZWdpc3RlcmVkIGZvciAlcyBieSAlT1xuIixkdGltZSh0aW1lKCkpLHcseCx5LHopKQorI2RlZmluZSBMT0dSRUdJU1RFUih3LHgseSx6KQorLy8jZGVmaW5lIExPR1VOUkVHSVNURVIoeCx5LHopIGxvZ19maWxlKCJFVkVOVExJU1RFTkVSIixzcHJpbnRmKFwKKy8vICAgICAgIlslc10gJU8gd2FzIHVucmVnaXN0ZXJlZCBmcm9tICVzIGJ5ICVPXG4iLGR0aW1lKHRpbWUoKSkseCx5LHopKQorI2RlZmluZSBMT0dVTlJFR0lTVEVSKHgseSx6KQorLy8jZGVmaW5lIExPR0VWRU5URklOSVNIKHgseSkgbG9nX2ZpbGUoIkVWRU5UUyIsIHNwcmludGYoXAorLy8gICAgICAiWyVzXSBFdmVudCAlcyAodHJpZ2dlcmVkIGJ5ICVPKSBmaW5pc2hlZFxuIixkdGltZSh0aW1lKCkpLHgseSkpCisjZGVmaW5lIExPR0VWRU5URklOSVNIKHgseSkKKworI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KSAgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpXAorICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksXAorICAgICAgICAgICAgICAgICAgICAgICJFREJHOiAiK3grIlxuIikKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tfUkVTRVJWRSAzMDAwMDAKKyNkZWZpbmUgVElDS1NQRVJDQUxMQkFDSyAzMDAwMAorCisvLyBJbmRpemVzIGZ1ZXIgQ2FsbGJhY2stSW5mb3MgKGV2ZW50cywgYWN0aXZlKQorI2RlZmluZSBDQl9GVU4gICAgICAgIDAKKyNkZWZpbmUgQ0JfQ0xPU1VSRSAgICAxCisjZGVmaW5lIENCX09CSkVDVCAgICAgMgorLy8gSW5kaXplcyBmdWVyIFBlbmRpbmcKKyNkZWZpbmUgUF9FSUQgICAgICAgICAwCisjZGVmaW5lIFBfVFJJR09CICAgICAgMQorI2RlZmluZSBQX1RSSUdPQk5BTUUgIDIKKyNkZWZpbmUgUF9BUkdTICAgICAgICAzCisjZGVmaW5lIFBfVElNRSAgICAgICAgNAorCisvLyBJbmRpemVzIGZ1ZXIgQWN0aXZlCisjZGVmaW5lIEFfRUlEICAgICAgICAgMAorI2RlZmluZSBBX1RSSUdPQiAgICAgIDEKKyNkZWZpbmUgQV9UUklHT0JOQU1FICAyCisjZGVmaW5lIEFfQVJHUyAgICAgICAgMworI2RlZmluZSBBX0xJU1RFTkVSUyAgIDQKKyNkZWZpbmUgQV9USU1FICAgICAgICA1CisKKy8qIGFsbGUgZXZlbnRzLCBkaWUgZXIga2VubnQuCisgICBEYXRlbnN0cnVrdHVyIGV2ZW50czoKKyAgIChbaWQ6KFtvYm5hbWU6ZnVuO2Nsb3N1cmU7b2JqZWN0LCAuLi4gXSksCisgICAgIGlkMjogKFsuLi4uXSksCisgICBdKSAqLworbWFwcGluZyBldmVudHM9KFtdKTsKKy8qIGFienVhcmJlaXRlbmRlIEV2ZW50cywgRGF0ZW5zdHJ1a3R1cjoKKyAgICh7ICh7aWQsIHRyaWdvYiwgdHJpZ29ibmFtZSwgYXJnc30pLCAKKyAgICAgICh7aWQyLCB0cmlnb2IsIHRyaWdvYm5hbWUsIGFyZ3N9KSwgLi4uIH0pICAqLworbm9zYXZlIG1peGVkIHBlbmRpbmc9KHt9KTsKKy8qIERlciBnZXJhZGUgYWt0aXZlIEV2ZW50LCBkZXIgd2lyZCBnZXJhZGUgYWJnZWFyYmVpdGV0LgorICAgRGF0ZW5zdHJ1a3R1ciBhY3RpdmU6CisgICAoeyBpZDp0cmlnb2I7dHJpZ29ibmFtZTthcmdzOyhbb2JuYW1lOmZ1bjtjbG9zdXJlO29iamVjdCwgLi4uXSksIHRyaWd0aW1lfSkKKyovCitub3NhdmUgbWl4ZWQgYWN0aXZlPSh7fSk7CisKK2ludCBsYXN0Ym9vdDsgLy8gWmVpdHN0ZW1wZWwgZGVzIGxldHp0ZW4gUmVib290cworLy8gRmxhZywgd2VubiBnZXNldHp0LCB6ZXJzdG9lcnQgc2ljaCBkZXIgRXZlbnRkLCB3ZW5uIGtlaW5lIEV2ZW50cworLy8gYWJ6dWFyYmVpdGVuIHNpbmQuCitub3NhdmUgaW50IHVwZGF0ZW1lOyAKKworLy8gZWluZmFjaGUgU3RhdGlzdGlrLCBnZXNwZWljaGVydCB3aXJkIGVpbiBIaXN0b2dyYW1tLiBLRXlzIHNpbmQgZGllCisvLyBaZWl0ZGlmZmVyZW56ZW4gendzY2hlbiBFaW50cmFnZW4gdW5kIEVybGVkaWdlbiBkZXMgRXZlbnRzLCBWYWx1ZXMgZGllCisvLyBIYWV1Zmlna2VpdGVuLgorbm9zYXZlIG1hcHBpbmcgc3RhdHM9KFtdKTsKKworCitwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzX2V2ZW50cygpOworcHJvdGVjdGVkIHZvaWQgc2F2ZV9tZSgpOwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpOworCisvLyBpc3QgZGVyIEV2ZW50LVR5cCAiZWlkIiBzY2hvbiBiZWthbm50LCBkLmguIGdpYiBlcyBtaW4uIDEgTGlzdGVuZXI/CisvLyBMaWVmZXJ0IEFuemFobCBkZXIgTGlzdGVuZXIgenVydWVjay4KK2ludCBDaGVja0V2ZW50SUQoc3RyaW5nIGVpZCkgeworICAgIGlmICghc3RyaW5ncChlaWQpIHx8ICFtZW1iZXIoZXZlbnRzLGVpZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybihzaXplb2YoZXZlbnRzW2VpZF0pKTsKK30KKworLy8gZW50c2NoZWlkZXQsIG9iIGVpbiBPYmpla3QgZnVlciBlaW5lbiBFdmVudCBlaW5nZXRyYWdlbiB3ZXJkZW4gZGFyZi4gWnVtCisvLyBVZWJlcnNjaHJlaWJlbiBpbiBnZWVyYnRlbiBEaXNwYXRjaGVybiwgaW4gZGllc2VtIFNjaGVkdWxlciBzaW5kIGFsbGUKKy8vIEV2ZW50cyBvZWZmZW50bGljaC4gQmVrb21tdCBkaWUgRXZlbnQtSUQsIGRhcyBlaW56dXRyYWdlbmRlIE9iamVrdCB1bmQgZGFzCisvLyBlaW50cmFnZW5kZSBPYmpla3QgdWViZXJnZWJlbi4KKy8vIDEgZnVlciBFcmxhdWJuaXMsIDAgc29uc3QuCitwcm90ZWN0ZWQgaW50IGFsbG93ZWQoc3RyaW5nIGVpZCwgb2JqZWN0IG9iLCBvYmplY3QgcG8pIHsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8vIGVudHNjaGVpZGV0LCBvYiBlaW4gT2JqZWt0IGVpbmVuIGJlc3RpbW10ZW4gRXZlbnQgdHJpZ2dlcm4gZGFyZi4gWnVtCisvLyBVZWJlcnNjaHJlaWJlbiBpbiBnZWVyYnRlbiBEaXNwYXRjaGVybiwgaW4gZGllc2VtIFNjaGVkdWxlciBzaW5kIGFsbGUKKy8vIEV2ZW50cyBvZWZmZW50bGljaC4gQmVrb21tdCBkaWUgRXZlbnQtSUQgdW5kIGRhcyB0cmlnZ2VybmRlIE9iamVrdAorLy8gdWViZXJnZWJlbi4KKy8vIDEgZnVlciBFcmxhdWJuaXMsIDAgc29uc3QuCitwcm90ZWN0ZWQgaW50IGFsbG93ZWR0cmlnZ2VyKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnZ2VyKSB7CisgICAgcmV0dXJuKDEpOworfQorCisvLyByZWdpc3RyaWVydCBzaWNoIGZ1ZXIgZWluZW4gRXZlbnQuIFdlbm4gZXMgZGVuIGJpc2hlciBuaWNodCBnaWJ0LCB3aXJkIGVyCisvLyBpbXBsaXppdCBlcnpldWd0LiBXZW5uIGRhcyBPYmpla3Qgb2Igc2Nob24gYW5nZW1lbGRldCB3YXIsIHdpcmQgZGVyCisvLyBiaXNoZXJpZ2UgRWludHJhZyB1ZWJlcnNjaHJpZWJlbi4KKy8vIDEgYmVpIEVyZm9sZywgPD0wIGJlaSBNaXNzZXJmb2xnCitpbnQgUmVnaXN0ZXJFdmVudChzdHJpbmcgZWlkLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2IpIHsKKyAgICBvYmplY3QgcG87CisgICAgaWYgKCFzdHJpbmdwKGVpZCkgfHwgIXN0cmluZ3AoZnVuKSB8fCAKKyAgICAgICAgIW9iamVjdHAob2IpIHx8ICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghYWxsb3dlZChlaWQsIG9iLCBwbykpIHJldHVybiAtMjsKKyAgICBjbG9zdXJlIGNsPXN5bWJvbF9mdW5jdGlvbihmdW4sb2IpOworICAgIGlmICghY2xvc3VyZXAoY2wpKQorICAgICAgICByZXR1cm4gLTM7CisgICAgaWYgKCFtYXBwaW5ncChldmVudHNbZWlkXSkpCisgICAgICAgIGV2ZW50c1tlaWRdPW1fYWxsb2NhdGUoMSwzKTsgLy8gMyBXZXJ0ZSBwcm8gS2V5CisgICAgZXZlbnRzW2VpZF0rPShbb2JqZWN0X25hbWUob2IpOmZ1bjtjbDtvYl0pOworLy8gICAgaWYgKGZpbmRfY2FsbF9vdXQoIydzYXZlX21lKT09LTEpCisvLyAgICAgICAgY2FsbF9vdXQoIydzYXZlX21lLDE1KTsKKyAgICBMT0dSRUdJU1RFUihvYixmdW4sZWlkLHBvKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gZW50ZmVybnQgZGFzIE9iamVrdCBhbHMgTGlzdGVuZXIgYXVzIGRlbSBFdmVudCBlaWQKKy8vIE1laHIgb2RlciB3ZW5pZ2VyIG9wdGlvbmFsLCB3ZW5uIGVpbiBldmVudCB2ZXJhcmJlaXRldCB3aXJkIHVuZCBkYXMgT2JqZWt0CisvLyBpc3QgbmljaHQgbWVociBhdWZmaW5kYmFyLCB3aXJkIGVzIGViZW5mYWxscyBnZWxvZXNjaHQuIEJlaSBzZWx0ZW4KKy8vIGdldHJpZ2dlcnRlbiBFdmVudHMgbXVlbGx0IGVzIGFiZXIgYmlzIGRhaGluIGRlbiBTcGVpY2hlciB2b2xsLgorLy8gKzEgZnVlciBFcmZvbGcsIDw9IDAgZnVlciBNaXNzZXJmb2xnCitpbnQgVW5yZWdpc3RlckV2ZW50KHN0cmluZyBlaWQsIG9iamVjdCBvYikgeworICAgIG9iamVjdCBwbzsKKyAgICBpZiAoIXN0cmluZ3AoZWlkKSB8fCAhb2JqZWN0cChvYikgfHwgCisgICAgICAgICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSB8fCAhbWFwcGluZ3AoZXZlbnRzW2VpZF0pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RyaW5nIG9uYW1lPW9iamVjdF9uYW1lKG9iKTsKKyAgICBpZiAoIW1lbWJlcihldmVudHNbZWlkXSxvbmFtZSkpIAorICAgICAgICByZXR1cm4gLTI7CisgICAgbV9kZWxldGUoZXZlbnRzW2VpZF0sb25hbWUpOworICAgIGlmICghc2l6ZW9mKGV2ZW50c1tlaWRdKSkKKyAgICAgICAgbV9kZWxldGUoZXZlbnRzLGVpZCk7CisgICAgLy8gYXVzIGFrdGl2ZW0gRXZlbnQgYXVzdHJhZ2VuLCBmYWxscyBlcyBkcmluIHNlaW4gc29sbHRlLgorICAgIGlmIChzaXplb2YoYWN0aXZlKSAmJiBhY3RpdmVbQV9FSURdID09IGVpZCkKKyAgICB7CisgICAgICBtX2RlbGV0ZShhY3RpdmVbQV9MSVNURU5FUlNdLCBvYmplY3RfbmFtZShvYikpOworICAgIH0KKy8vICAgIGlmIChmaW5kX2NhbGxfb3V0KCMnc2F2ZV9tZSk9PS0xKQorLy8gICAgICBjYWxsX291dCgjJ3NhdmVfbWUsMTUpOworICAgIExPR1VOUkVHSVNURVIob2IsIGVpZCwgcG8pOworICAgIHJldHVybiAxOworfQorCisvLyBMb2VzdCBlaW5lbiBFdmVudCBhdXMuCisvLyAxIGZ1ZXIgRXJmb2xnLCA8PSAwIGZ1ZXIgTWlzc2VyZm9sZwordmFyYXJncyBpbnQgVHJpZ2dlckV2ZW50KHN0cmluZyBlaWQsIG1peGVkIGFyZ3MpIHsKKyAgICBvYmplY3QgdHJpZ2dlcjsKKyAgICBpZiAoIXN0cmluZ3AoZWlkKSB8fCAKKyAgICAgICAgIW9iamVjdHAodHJpZ2dlcj1wcmV2aW91c19vYmplY3QoKSkpIAorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFhbGxvd2VkdHJpZ2dlcihlaWQsIHRyaWdnZXIpKSByZXR1cm4gLTI7CisgICAgaWYgKCFtZW1iZXIoZXZlbnRzLGVpZCkpIHJldHVybiAtMzsKKyAgICBpZiAoc2l6ZW9mKHBlbmRpbmcpID4gX19NQVhfQVJSQVlfU0laRV9fLzUpCisgICAgICAgIHJldHVybiAtNDsKKyAgICBwZW5kaW5nKz0oeyAoe2VpZCx0cmlnZ2VyLG9iamVjdF9uYW1lKHRyaWdnZXIpLCBhcmdzLCB0aW1lKCl9KSB9KTsKKyAgICBpZiAoZmluZF9jYWxsX291dCgjJ3Byb2Nlc3NfZXZlbnRzKSA9PSAtMSkKKyAgICAgIGNhbGxfb3V0KCMncHJvY2Vzc19ldmVudHMsMCk7CisgICAgTE9HRVZFTlQoZWlkLHRyaWdnZXIsYXJncyk7CisgICAgLy9ERUJVRyhzcHJpbnRmKCIlTyIscGVuZGluZykpOworICAgIHJldHVybiAxOworfQorCitwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzX2V2ZW50cygpIHsKKyAgLy8gZXJzdG1hbCB3aWVkZXIgbmVuIGNhbGxfb3V0IGVpbnRyYWdlbi4KKyAgY2FsbF9vdXQoIydwcm9jZXNzX2V2ZW50cywgMSk7CisKKyAgLy8gc29sYW5nZSB1ZWJlciBhY3RpdmUgdW5kIHBlbmRpbmcgbGF1ZmVuLCBiaXMga2VpbmUgVGlja3MgbWVociBkYSBzaW5kLAorICAvLyBiencuIGluIGRlciBTY2hsZWlmZSBhYmdlYnJvY2hlbiB3aXJkLCB3ZWlsIGtlaW5lIEV2ZW50cyBtZWhyIGRhIHNpbmQuCisgIHdoaWxlKGdldF9ldmFsX2Nvc3QoKSA+IFRJQ0tfUkVTRVJWRSkgeworICAgIC8vIEhCIGFic2NoYWx0ZW4sIHdlbm4gbml4IHp1IHR1biBpc3QuCisgICAgaWYgKCFzaXplb2YoYWN0aXZlKSkgeworICAgICAgaWYgKCFzaXplb2YocGVuZGluZykpIHsKKyAgICAgICAgcmVtb3ZlX2NhbGxfb3V0KCMncHJvY2Vzc19ldmVudHMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIHNjaGVpbnQgbm9jaCBtaW4uIGVpbiBFaW50cmFnIGluIHBlbmRpbmcgenUgc2VpbiwgbmFjaCBhY3RpdmUga29waWVyZW4sCisgICAgICAvLyBwbHVzIGRpZSBDYWxsYmFjay1JbmZvcyBhdXMgZXZlbnRzCisgICAgICBhY3RpdmU9KHtwZW5kaW5nWzBdW1BfRUlEXSwKKyAgICAgICAgICAgICAgIHBlbmRpbmdbMF1bUF9UUklHT0JdLHBlbmRpbmdbMF1bUF9UUklHT0JOQU1FXSwKKyAgICAgICAgICAgICAgIHBlbmRpbmdbMF1bUF9BUkdTXSwKKyAgICAgICAgICAgICAgIGRlZXBfY29weShldmVudHNbcGVuZGluZ1swXVtQX0VJRF1dKSwKKyAgICAgICAgICAgICAgIHBlbmRpbmdbMF1bUF9USU1FXSB9KTsKKworICAgICAgaWYgKHNpemVvZihwZW5kaW5nKT4xKQorICAgICAgICBwZW5kaW5nPXBlbmRpbmdbMS4uXTsgLy8gdW5kIGF1cyBwZW5kaW5nIGVyc3RtYWwgbG9lc2NoZW4uIDstKQorICAgICAgZWxzZQorICAgICAgICBwZW5kaW5nPSh7fSk7CisgICAgICAvL0RFQlVHKHNwcmludGYoIlBlbmRpbmc6ICVPIixwZW5kaW5nKSk7CisgICAgICAvL0RFQlVHKHNwcmludGYoIkFjdGl2ZTogJU8iLGFjdGl2ZSkpOworICAgIH0KKyAgICAvLyBqZXR6dGUgZGVuIGFrdGl2ZW4gRXZlbnQgYWJhcmJlaXRlbi4KKyAgICAvLyBJbmZvcyBhdXMgYWN0aXZlIGhvbGVuLi4uCisgICAgc3RyaW5nIGVpZD1hY3RpdmVbQV9FSURdOworICAgIG9iamVjdCB0cmlnb2I9YWN0aXZlW0FfVFJJR09CXTsKKyAgICBzdHJpbmcgdHJpZ29ibmFtZT1hY3RpdmVbQV9UUklHT0JOQU1FXTsKKyAgICBtaXhlZCBhcmdzPWFjdGl2ZVtBX0FSR1NdOworICAgIG1hcHBpbmcgbGlzdGVuZXJzPWFjdGl2ZVtBX0xJU1RFTkVSU107CisgICAgLy8gdW5kIHVlYmVyIGFsbGUgTGlzdGVuZXIgaXRlcmllcmVuCisgICAgZm9yZWFjaChzdHJpbmcgb2JuYW1lLCBzdHJpbmcgZnVuLCBjbG9zdXJlIGNsLCBvYmplY3QgbGlzdGVuZXI6IAorICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMpIHsKKyAgICAgIC8vIGVyc3QgcHJ1ZWZlbiwgb2Igbm9jaCBnZW51ZyBUaWNrcyBkYSBzaW5kLiB3ZW5uIG5pY2h0LCBnZWh0cyBpbQorICAgICAgLy8gbmFlY2hzdGVuIFp5a2x1cyB3ZWl0ZXIuCisgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgVElDS19SRVNFUlZFKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIHdlbm4gQ2xvc3VyZSB1bmQvb2RlciB6dWdlaG9lcmlnZXMgT2JqZWt0IG5pY2h0IGV4aXN0aWVyZW4sIHZlcnN1Y2hlbgorICAgICAgLy8gd2lyIGVyc3RtYWwsIGVzIHdpZWRlcnp1ZmluZGVuLiA7LSkKKyAgICAgIGlmICghb2JqZWN0cChxdWVyeV9jbG9zdXJlX29iamVjdChjbCkpKSB7CisgICAgICAgIGlmIChvYmplY3RwKGxpc3RlbmVyPWZpbmRfb2JqZWN0KG9ibmFtZSkpICYmCisgICAgICAgICAgICBjbG9zdXJlcChjbD1zeW1ib2xfZnVuY3Rpb24oZnVuLGxpc3RlbmVyKSkpIHsKKyAgICAgICAgICAgIC8vZ2VrbGFwcHQsIGF1Y2ggaW4gZXZlbnRzIHdpZWRlciBlcmdhZW56ZW4KKyAgICAgICAgICAgIGV2ZW50c1tlaWRdW29ibmFtZSxDQl9DTE9TVVJFXT1jbDsKKyAgICAgICAgICAgIGV2ZW50c1tlaWRdW29ibmFtZSxDQl9PQkpFQ1RdPWxpc3RlbmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIE9iamVrdCBuaWNodCBnZWZ1bmRlbiBvZGVyIENsb3N1cmUgbmljaHQgZXJ6ZXVnYmFyLCBhdXN0cmFnZW4KKyAgICAgICAgICBtX2RlbGV0ZShsaXN0ZW5lcnMsb2JuYW1lKTsKKyAgICAgICAgICAvLyB1bmQgYXVzIGV2ZW50cyBhdXN0cmFnZW4uCisgICAgICAgICAgbV9kZWxldGUoZXZlbnRzW2VpZF0sb2JuYW1lKTsKKyAgICAgICAgICAvLyB1bmQgbmFlY2hzdGVyIER1cmNoZ2FuZworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBPYmpla3Qgbm9jaCBkYSwgQ2xvc3VyZSB3aXJkIGFscyBhdXNmdWVocmJhciBiZXRyYWNodGV0LiAKKyAgICAgIGNhdGNoKGxpbWl0ZWQoIydmdW5jYWxsLCh7VElDS1NQRVJDQUxMQkFDS30pLGNsLGVpZCx0cmlnb2IsYXJncyk7cHVibGlzaCk7CisgICAgICAvLyBmZXJ0aWcgbWl0IGRpZXNlbSBPYmpla3QuCisgICAgICBtX2RlbGV0ZShsaXN0ZW5lcnMsb2JuYW1lKTsKKyAgICB9CisgICAgLy8gU3RhdGlzdGlrPyBEaWZmZXJlbnplbiB6d2lzY2hlIEVybGVkaWd1bmdzemVpdCB1bmQgRWludHJhZ3N6ZWl0IGJpbGRlbgorICAgIC8vIGRpZSBLZXlzLCBkaWUgVmFsdWVzIHdlcmRlbiBlaW5mYWNoIGhvY2hnZXphZWhsdC4KKyNpZmRlZiBTVEFUSVNUSUNTCisgICAgc3RhdHNbdGltZSgpLWFjdGl2ZVtBX1RJTUVdXSsrOworI2VuZGlmIC8vIFNUQVRJU1RJQ1MKKyAgICAvLyBvaywgZmVydGlnIG1pdCBhY3RpdmUuCisgICAgYWN0aXZlPSh7fSk7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJGZXJ0aWc6ICVPICVPIixlaWQsIHRyaWdvYm5hbWUpKTsKKyAgICBMT0dFVkVOVEZJTklTSChlaWQsdHJpZ29ibmFtZSk7CisgIH0gIC8vIHdoaWxlKGdldF9ldmFsX2Nvc3QoKSA+IFRJQ0tfUkVTRVJWRSkKKworICAvLyBTb2xsIGRpZXMgRGluZyBuZXVnZWxhZGVuIHdlcmRlbj8gV2VubiBqYSwgU2VsYnN0emVyc3RvZXJ1bmcsIHdlbm4ga2VpbmUKKyAgLy8gRXZlbnRzIG1laHIgZGEgc2luZC4KKyAgaWYgKHVwZGF0ZW1lICYmICFzaXplb2YoYWN0aXZlKSAmJiAhc2l6ZW9mKHBlbmRpbmcpKSB7CisgICAgREVCVUcoc3ByaW50ZigiVXBkYXRlIHJlcXVlc3RlZFxuIikpOworICAgIHJlbW92ZSgxKTsKKyAgfQorfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgICAgc2V0ZXVpZChnZXR1aWQoTUUpKTsKKyAgICByZXN0b3JlX29iamVjdChTVE9SRSk7CisgICAgaWYgKGxhc3Rib290ICE9IF9fQk9PVF9USU1FX18pIHsKKyAgICAgIC8vIE9oLiBSZWJvb3Qgd2FyLi4uIEFsbGUgRXZlbnRzIHdlZ3NjaG1laXNzZW4gKGVzIGtvZW5udGVuIHp3YXIgZGllCisgICAgICAvLyBFdmVudGFubWVsZHVuZ2VuIHZvbiBCUHMgdWViZXJsZWJlbiwgYWJlciBhdWNoIGRpZSBzb2xsZW4gc2ljaCBsaWViZXIKKyAgICAgIC8vIGltIGNyZWF0ZSgpIGFubWVsZGVuLikKKyAgICAgIGV2ZW50cz0oW10pOworICAgICAgbGFzdGJvb3Q9X19CT09UX1RJTUVfXzs7CisgICAgfQorICAgIExPRygiRXZlbnQtRGlzcGF0Y2hlciBsb2FkZWQiKTsKK30KKworCitwcm90ZWN0ZWQgdm9pZCBzYXZlX21lKCkgeworICBzYXZlX29iamVjdChTVE9SRSk7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgICAgc2F2ZV9tZSgpOworICAgIERFQlVHKHNwcmludGYoInJlbW92ZSgpIGNhbGxlZCBieSAlTyAtIGRlc3RydWN0aW5nXG4iLCBwcmV2aW91c19vYmplY3QoKSkpOyAKKyAgICBMT0coc3ByaW50ZigicmVtb3ZlIGNhbGxlZCBieSAlTyAtIGRlc3RydWN0aW5nIixwcmV2aW91c19vYmplY3QoKSkpOworICAgIGRlc3RydWN0KE1FKTsKKyAgICByZXR1cm4gMTsKK30KKworcHVibGljIHZvaWQgcmVzZXQoKSB7CisgIGlmICh1cGRhdGVtZSAmJiAhc2l6ZW9mKGFjdGl2ZSkgJiYgIXNpemVvZihwZW5kaW5nKSkgeworICAgIERFQlVHKHNwcmludGYoIlVwZGF0ZSByZXF1ZXN0ZWRcbiIpKTsKKyAgICByZW1vdmUoMSk7CisgIH0KK30KKworCisvLyBmdWVyIERlYnVnendlY2tlLiBJbnRlcmZhY2UgdW5kIFZlcmhhbHRlbiBrYW5uIHNpY2ggamVkZXJ6ZWl0IG9obmUKKy8vIFZvcmFua3VlbmRpZ3VuZyBhZW5kZXJuLgorbWFwcGluZyBRdWVyeUV2ZW50cygpIHsKKyAgICByZXR1cm4oZGVlcF9jb3B5KGV2ZW50cykpOworfQorCittaXhlZCBRdWVyeVBlbmRpbmcoKSB7CisgICAgcmV0dXJuKGRlZXBfY29weShwZW5kaW5nKSk7Cit9CisKK21peGVkIFF1ZXJ5QWN0aXZlKCkgeworICAgIHJldHVybihkZWVwX2NvcHkoYWN0aXZlKSk7Cit9CisKK21hcHBpbmcgUXVlcnlTdGF0cygpIHsKKyAgICByZXR1cm4oY29weShzdGF0cykpOworfQorCitpbnQgVXBkYXRlTWUoaW50IGZsYWcpIHsKKyAgICB1cGRhdGVtZT1mbGFnOworICAgIGlmIChmaW5kX2NhbGxfb3V0KCMncHJvY2Vzc19ldmVudHMpPT0tMSkKKyAgICAgIHJlc2V0KCk7CisgICAgcmV0dXJuIGZsYWc7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL2Zpbmdlci5jIGIvcC9kYWVtb24vZmluZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNjAyYQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2Zpbmdlci5jCkBAIC0wLDAgKzEsNDQzIEBACisvKiBhIGZpbmdlcgorICogT3JpZ2luYWwgKGMpIDE0LjAzLjE5OTMgYnkgVGF1YmUgQE5pZ2h0ZmFsbAorICogVW1zZXR6dW5nIGZ1ZXIgTW9yZ2VuZ3JhdWVuIDA5LjA4LjE5OTMgYnkgTG9jbworCisgICBWZXJ3ZW5kdW5nIGF1c3NlcmhhbGIgdm9uIE1vcmdlbmdyYXVlbiBpc3QgZ2VzdGF0dGV0IHVudGVyIGZvbGdlbmRlbgorICAgQmVkaW5ndW5nZW46CisgICAtIEJlbnV0enVuZyBlcmZvbGd0IGF1ZiBlaWdlbmUgR2VmYWhyLiBKZWdsaWNoZSBWZXJhbnR3b3J0dW5nIHdpcmQKKyAgICAgYWJnZWxlaG50LgorICAgLSBBdWNoIGluIHZlcmFlbmRlcnRlbiBvZGVyIGFiZ2VsZWl0ZXRlbiBPYmpla3RlbiBtdXNzIGVpbiBIaW53ZWlzIGF1ZgorICAgICBkaWUgSGVya3VuZnQgZXJoYWx0ZW4gYmxlaWJlbi4KKyAgIEVpbiBVcGRhdGUtU2VydmljZSBiZXN0ZWh0IG5pY2h0LgorCisgKiAyOS5Pa3QgMTk5MyBTZWhlcnZlcnNpb24uCisgKiBzcGFldGVyIGF1Y2ggZnVlciBleHRlcm5lbiBBdWZydWYgdmVyd2VuZGJhciBnZW1hY2h0CisgKiAxMy5Pa3QgLnBsYW4gdW5kIC5wcm9qZWN0IGtvZW5uZW4gYXVjaCBpbiB+bG9jby9wbGFucyBzZWluLgorICogMTUuSmFuIDE5OTQgYW5nZXBhc3N0IGFuIG5ldWVzIFNwZWljaGVyZm9ybWF0CisgKiAwMi0wNS5EZXo5NCAtbiwgLXAKKyAqCisgKiBHZWxlZ2VudGxpY2ggbWlub3IgY2hhbmdlcywgenVsZXR6dCAwNC5Pa3QuOTUKKyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLCBub19zaGFkb3cKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2RlZmluZSBIQklOVCAgICAyICAgLyogaW50ZXJ2YWwgYmV0d2VlbiB0d28gaGVhcnRfYmVhdHMgaW4gc2Vjb25kcyAqLworI2RlZmluZSBNSU5JRExFIDYwICAgLyogbWluaW11bSBpZGxlIHRpbWUgaW4gc2Vjb25kcyB0byBiZSBzdGF0ZWQgaWRsZSAqLworI2RlZmluZSBUQkFOSVNIX0VYVFJBQ1QgNzEuLiAgLyogRGVyIGJlbm9ldGlndGUgVGVpbCBkZXMgVEJhbmlzaC1zdHJpbmdzICovCisKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSB3aXogKGxvY2FsICYmIElTX0xFQVJORVIoVFApKQorI2RlZmluZSBzZWVyIChsb2NhbCAmJiBJU19TRUVSKFRQKSkKKyNkZWZpbmUgSU4gKChwcm9wZXJ0aWVzW1BfR0VOREVSXT09Mik/ImluIjoiIikKKworCisjZGVmaW5lIEZMQUdfTk9QTEFOIDEKKyNkZWZpbmUgRkxBR19MT05HIDIKKyNkZWZpbmUgRkxBR19TUE9OU09SIDQKKyNkZWZpbmUgRkxBR19WSVNfTE9HT1VUIDgKKyNkZWZpbmUgRkxBR19BVkFUQVIgMTYKKworCittYXBwaW5nIHByb3BlcnRpZXM7CitpbnQgYWdlLGludmlzLGhjX3BsYXk7CitpbnQgZmlsZXRpbWU7CittYXBwaW5nIHJlbGF0aXZlczsKKworCit2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICBmaWxldGltZT0wOworfQorCisKK3N0cmluZyB0aW1lZGlmZihpbnQgdGltZSkKK3sKKyAgc3RyaW5nIHJldDsKKworICByZXQ9IiI7CisgIGlmICggdGltZSA+PSA4NjQwMCozNjUgKSB7CisgICAgcmV0Kz10aW1lLyg4NjQwMCozNjUpKyJhICI7CisgICAgdGltZSU9KDg2NDAwKjM2NSk7CisgIH0KKyAgaWYodGltZT49ODY0MDApIHsKKyAgICByZXQrPXRpbWUvODY0MDArImQgIjsKKyAgICB0aW1lJT04NjQwMDsKKyAgfQorICBpZih0aW1lPDM2MDAwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lLzM2MDArIjoiOworICB0aW1lJT0zNjAwOworICBpZih0aW1lPDYwMCkgcmV0Kz0iMCI7CisgIHJldCs9dGltZS82MCsiOiI7CisgIHRpbWUlPTYwOworICBpZih0aW1lPDEwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lKyIiOworICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgc3BvbnNvcmluZyhzdHJpbmcgbmFtZSkKK3sKKyAgaW50IGksdzsKKyAgc3RyaW5nICpzLHMyLHMzLHM0OworICAvLyBEYXRlbiBlaW5sZXNlbiwgd2VubiBkaWUgZGF0ZW4gYWVsdGVyIGFscyAxIFRhZyBzaW5kIG9kZXIgc2ljaAorICAvLyAvbG9nL1NQT05TT1JTIGdlYWVuZGVydCBoYXQuCisgIGlmICgodGltZSgpID4gZmlsZXRpbWUrODY0MDApIHx8CisgICAgICBmaWxldGltZSE9ZmlsZV90aW1lKCIvbG9nL1NQT05TT1IiKSkgCisgIHsKKyAgICAgIHJlbGF0aXZlcz1tX2FsbG9jYXRlKDAsMik7CisgICAgICBmaWxldGltZT1maWxlX3RpbWUoIi9sb2cvU1BPTlNPUiIpOworICAgICAgcz1leHBsb2RlKHJlYWRfZmlsZSgiL2xvZy9TUE9OU09SIiksIlxuIik7CisgICAgICBmb3JlYWNoKHN0cmluZyBzdHI6IHMpIHsgCisJICBzc2NhbmYoc3RyLCIlczogJXMgbWFjaHQgJXMgenVtIExlYXJuZXIuIixzMixzMyxzNCk7CisJICBpZiAoSVNfTEVBUk5FUihsb3dlcl9jYXNlKHMzKSkgJiYgSVNfTEVBUk5FUihsb3dlcl9jYXNlKHM0KSkpCisgICAgICAgICAgeworICAgICAgICAgICAgIHJlbGF0aXZlc1tsb3dlcl9jYXNlKHM0KSwwXT1zMzsKKyAgICAgICAgICAgICBzMz1sb3dlcl9jYXNlKHMzKTsKKyAgICAgICAgICAgICBzNCs9IiAoIitxdWVyeV93aXpfbGV2ZWwobG93ZXJfY2FzZShzNCkpKyIpIjsKKyAgICAgICAgICAgICBpZiAoIXJlbGF0aXZlc1tzMywxXSkgcmVsYXRpdmVzW3MzLDFdPSh7czR9KTsKKyAgICAgICAgICAgICBlbHNlIHJlbGF0aXZlc1tzMywxXSs9KHtzNH0pOworICAgICAgICAgIH0KKyAgICAgIH0gIAorICB9CisgIHMyPSIiOworICBpZiAocmVsYXRpdmVzW25hbWUsMF0pCisgICAgczIrPSJWb3JmYWhyZTogICAgICIrcmVsYXRpdmVzW25hbWUsMF0rIlxuIjsKKyAgaWYgKHJlbGF0aXZlc1tuYW1lLDFdKQorICAgIHMyKz0iTmFjaGZhaHJlKG4pOiAiK2JyZWFrX3N0cmluZyhpbXBsb2RlKHJlbGF0aXZlc1tuYW1lLDFdLCIsICIpLDc4LDE0KVsxNC4uXTsKKyAgcmV0dXJuIHMyOworfQorCit2YXJhcmdzIHN0cmluZyBmaW5nZXJfc2luZ2xlKHN0cmluZyBzdHIsaW50IGxvY2FsKQoreworICBtaXhlZCAgKnVzZXJpbmZvOworICBzdHJpbmcgaXAsdGV4dCxpcG51bSxmaWxlbmFtZSxhd2F5OworICBpbnQgd2l6bGV2ZWwscGxheWVybGV2ZWwsaWRsZSxwb3MsZmxhZ3MsbGFzdDsKKyAgbWl4ZWQgaCxkYXRhLHRtcDsKKyAgb2JqZWN0IHBsYXllcixvYjsKKworICAvKkRFQlVHIyMjICB0ZWxsX29iamVjdCgoZmluZF9wbGF5ZXIoImxvY28iKXx8dGhpc19vYmplY3QoKSksIkZpbmdlciByZXF1ZXN0OiAnIitzdHIrIicoIitsb2NhbCsiKVxuIik7LyoqLworICBzdHI9bG93ZXJfY2FzZShzdHIpOworICB0ZXh0PSIiOworICBhd2F5PSIiOworICBoY19wbGF5PTA7CisgIAorICBoPWV4cGxvZGUoc3RyLCIgIik7CisgIGlmIChzaXplb2YoaCk9PTEpIGg9ZXhwbG9kZShzdHIsIisiKTsKKyAgaWYgKG1lbWJlcihoLCItbiIpPj0wKSBmbGFncz1GTEFHX05PUExBTjsKKyAgaWYgKG1lbWJlcihoLCItcCIpPj0wKSBmbGFncz0wOworICBpZiAobWVtYmVyKGgsIi1sIik+PTApIGZsYWdzfD1GTEFHX0xPTkc7CisgIGlmIChtZW1iZXIoaCwiLXMiKT49MCkgZmxhZ3N8PUZMQUdfU1BPTlNPUjsKKyAgaWYgKG1lbWJlcihoLCItdiIpPj0wKSBmbGFnc3w9RkxBR19WSVNfTE9HT1VUOworICBpZiAobWVtYmVyKGgsIi1hIik+PTApIGZsYWdzfD1GTEFHX0FWQVRBUjsKKworICBoPShoLSh7Ii1uIiwiLXAiLCItbCIsIi1zIiwgIi12IiwiLWEifSkpOworICBpZiAoIXNpemVvZihoKSkgeworICAgIHRleHQ9IkR1IHNvbGx0ZXN0IHNjaG9uIHNhZ2VuLCB3ZXIgRGljaCBpbnRlcmVzc2llcnQhXG4iOworICAgIGlmIChsb2NhbCkgcmV0dXJuIHdyaXRlKHRleHQpLDA7CisgICAgZWxzZSByZXR1cm4gdGV4dDsKKyAgfQorICBzdHI9aFswXTsKKyAgaWYgKCFzaXplb2Yoc3RyKSB8fCBzdHJbMF08J2EnIHx8IHN0clswXT4neicpIHsKKyAgICB0ZXh0PSJBbHNvLCBzbyAoIitzdHIrIikgaGVpc3N0IGJlc3RpbW10IGtlaW4gU3BpZWxlciBoaWVyIVxuIjsKKyAgICBpZiAobG9jYWwpIHJldHVybiB3cml0ZSh0ZXh0KSwwOworICAgIGVsc2UgcmV0dXJuIHRleHQ7CisgIH0KKworICAvKiBkb2VzIHRoaXMgcGxheWVyIGV4aXN0PyAqLworICBzdHI9b2xkX2V4cGxvZGUoc3RyLCIuIilbMF07CisgIHVzZXJpbmZvPU1BU1RFUi0+Z2V0X3VzZXJpbmZvKHN0cik7CisgIHBsYXllcj1maW5kX3BsYXllcihzdHIpfHxmaW5kX25ldGRlYWQoc3RyKTsKKworICBpZiggKCFwb2ludGVycCh1c2VyaW5mbykgfHwgdXNlcmluZm9bVVNFUl9MRVZFTCsxXT09LTEpCisJJiYgIXBsYXllcikgeworICAgIHRleHQ9IkhtbS4uLiBkaWVzZW4gTmFtZW4gZ2lidCBlcyBpbSAiTVVETkFNRSIgbmljaHQuXG4iOworICAgIGlmICh0bXA9Ii9zZWN1cmUvbWFzdGVyIi0+UXVlcnlCYW5pc2hlZChzdHIpKXsKKyAgICAgIHRleHQ9IkhvcHBsYSAtIGRpZXNlciBOYW1lIGlzdCByZXNlcnZpZXJ0IG9kZXIgZ2VzcGVycnQgKFwiZ2ViYW5pc2h0XCIpIVxuIjsKKyAgICAgIGlmICggdG1wICE9ICJEaWVzZXIgTmFtZSBpc3QgZ2VzcGVycnQuIiApCisgICAgICAgICAgdGV4dCArPSAiR3J1bmQgZnVlciBkaWUgU3BlcnJ1bmc6ICIgKyB0bXAgKworICAgICAgICAgICAgICAobWVtYmVyKCAoeychJywnPycsJy4nfSksIHRtcFs8MV0gKSAhPSAtMSA/ICIiIDogIi4iKSArICJcbiI7CisgICAgfQorICAgIGlmIChsb2NhbCkgcmV0dXJuIHdyaXRlKHRleHQpLDA7CisgICAgZWxzZSByZXR1cm4gdGV4dDsKKyAgfQorCisgIGlmIChwbGF5ZXIpIHsKKyAgICBoY19wbGF5PXBsYXllci0+cXVlcnlfaGNfcGxheSgpOworICAgIHByb3BlcnRpZXM9cGxheWVyLT5RdWVyeVByb3BlcnRpZXMoKTsKKyAgICBwcm9wZXJ0aWVzW1BfUkFDRV09cGxheWVyLT5RdWVyeVByb3AoUF9SQUNFKTsKKyAgICBwcm9wZXJ0aWVzW1BfVklTSUJMRV9HVUlMRF09cGxheWVyLT5RdWVyeVByb3AoUF9WSVNJQkxFX0dVSUxEKTsKKyAgICBwcm9wZXJ0aWVzW1BfVElUTEVdPXBsYXllci0+UXVlcnlQcm9wKFBfVElUTEUpOworICAgIHRtcCA9IHBsYXllci0+UXVlcnlQcm9wKFBfUFJFU0FZKTsKKyAgICBwcm9wZXJ0aWVzW1BfUFJFU0FZXT0oc3RyaW5ncCh0bXApICYmIHNpemVvZih0bXApPjEpID8gdG1wWzAuLjwyXSA6IDA7CisgIH0KKyAgZWxzZQorICAgIHJlc3RvcmVfb2JqZWN0KCIvc2F2ZS8iK3N0clswLi4wXSsiLyIrc3RyKTsKKyAgaWYgKCFwcm9wZXJ0aWVzKQorICB7CisgICAgdGV4dCs9Ik1pc3QhISEgRGFzIEVpbmxlc2VuIGRlciBEYXRlbiBrbGFwcHQgbmljaHQgd2llIGVzIHNvbGwgOi0oXG4iOworICAgIHByb3BlcnRpZXM9MDsKKyAgICBpZiAoIWxvY2FsKQorICAgICAgcmV0dXJuIHRleHQ7CisgICAgd3JpdGUodGV4dCk7CisgICAgcmV0dXJuICIiOworICB9CisgIGlmICggcGxheWVyICYmIGludGVyYWN0aXZlKHBsYXllcikgKQorICAgICAgaXBudW0gPSBxdWVyeV9pcF9udW1iZXIocGxheWVyKTsKKyAgZWxzZQorICAgICAgaXBudW0gPSBwcm9wZXJ0aWVzW1BfQ0FMTEVEX0ZST01fSVBdOworICAvLyBmcnVlaGVyIHN0YW5kIGluIFBfQ0FMTEVEX0ZST01fSVAgZXZ0bC4gYXVjaCBkZXIgTmFtZSBkaXJla3QgZHJpbgorICAvLyBhbnN0ZWxsZSBkZXIgbnVtZXJpc2NoZW4gSVAKKyAgaXA9cXVlcnlfaXBfbmFtZShpcG51bSl8fHByb3BlcnRpZXNbUF9DQUxMRURfRlJPTV9JUF07CisgIGlmKHBsYXllcikgeworICAgICAgaWYgKCFpbnRlcmFjdGl2ZShwbGF5ZXIpIHx8IChpZGxlPXF1ZXJ5X2lkbGUocGxheWVyKSk8TUlOSURMRSkKKyAgICAgICAgICBpZGxlPTA7CisgICAgICBpZiAoIShpbnZpcz1hZ2U9cGxheWVyLT5RdWVyeVByb3AoUF9JTlZJUykpKQorICAgICAgICAgIGFnZT1wbGF5ZXItPlF1ZXJ5UHJvcChQX0FHRSk7CisgIH0gZWxzZSB7CisgICAgaWYgKHByb3BlcnRpZXNbUF9JTlZJU10pIGFnZT1wcm9wZXJ0aWVzW1BfSU5WSVNdOworICAgIGlkbGU9cHJvcGVydGllc1tQX0xBU1RfTE9HT1VUXTsKKyAgfQorCisgICB3aXpsZXZlbD1xdWVyeV93aXpfbGV2ZWwoc3RyKTsKKyAgIGlmICggKHRtcCA9IGZpbGVfdGltZSgiL3NhdmUvIitzdHJbMC4uMF0rIi8iK3N0cisiLm8iKSkgPD0gMCApCisgICAgICAgLy8gSGFjaywgdW0gYmVpIGdhbnogImZyaXNjaGVuIiBTcGllbGVybiAobm9jaCBrZWluIFNhdmVmaWxlIHZvcmhhbmRlbikKKyAgICAgICAvLyBkaWUgQXVzZ2FiZSB2b24gMS4xLjE5NzAgenUgdmVyaGluZGVybgorICAgICAgIHRtcCA9IHRpbWUoKTsKKyAgIGxhc3Q9cHJvcGVydGllc1tQX0xBU1RfTE9HT1VUXTsKKyAgIGlmICggbGFzdCA8PSAwIHx8ICghKGZsYWdzJkZMQUdfVklTX0xPR09VVCkgJiYgd2l6ICYmIHdpemxldmVsID4gMTAKKyAgICAgICAgICAgICAgICAgICYmIHByb3BlcnRpZXNbUF9JTlZJU10gJiYgdG1wIC0gbGFzdCA+IDMwMCkgKQorICAgICAgIGxhc3QgPSB0bXA7CisKKyAgLyogb3V0cHV0IHJvdXRpbmUgZm9yIGFsbCAqLworICBpZihwbGF5ZXIpIHsKKyAgICBoPXBsYXllci0+UXVlcnlQcm9wKFBfUkFDRSk7CisgICAgaWYoaW50ZXJhY3RpdmUocGxheWVyKSAmJiAod2l6IHx8ICFpbnZpcykpIHsKKyAgICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBhbndlc2VuZCxcbiIrCisgICAgICAgICJ1bmQgendhciB2b246ICIrCisgICAgICAgICAgKHdpeiA/IChpcCsoaXBudW0/IiAoIitpcG51bSsiKSI6IiIpKToiIikrCisgICAgICAgICAgKHN0cmluZ3AocHJvcGVydGllc1tQX0xPQ0FUSU9OXSkgPyAod2l6ID8gIlxuICAgICAgICAgICAgICBbIiA6ICIiKQorICAgICAgICAgICArY2FwaXRhbGl6ZShwcm9wZXJ0aWVzW1BfTE9DQVRJT05dKSsKKyAgICAgICAgICAgKChwcm9wZXJ0aWVzW1BfTE9DQVRJT05dICE9IGNvdW50cnkoaXAsIGlwbnVtKSkKKyAgICAgICAgICAgID8gIiAodWViZXIgIitjb3VudHJ5KGlwLCBpcG51bSkrIikiIDogIiIgKQorICAgICAgICAgICA6ICh3aXo/IiBbIjoiIikrY291bnRyeShpcCwgaXBudW0pKSsod2l6ID8gIl0iOiIiKSsiLlxuIjsKKyAgICAgIGlmKGlkbGUpCisgICAgICAgIHRleHQrPSJQYXNzaXYgc2VpdDogIit0aW1lZGlmZihpZGxlKSsiXG4iOworICAgICBpZiAobG9jYWwpCisgICAgICB0ZXh0Kz0iRWluZ2Vsb2dndCBzZWl0OiAiK2R0aW1lKHByb3BlcnRpZXNbUF9MQVNUX0xPR0lOXSkrIlxuIjsKKyAgICAgaWYgKHByb3BlcnRpZXNbUF9BV0FZXSkKKyAgICAgICBhd2F5PSJ6LlouIGFid2VzZW5kLCBHcnVuZCAgOiAiK3Byb3BlcnRpZXNbUF9BV0FZXSsiXG4iOworICAgIH0gZWxzZQorICAgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IG5pY2h0IGFud2VzZW5kLlxuWnVsZXR6dCBlaW5nZWxvZ2d0IHZvbjogIisKKyAgICAgICAgKHdpeiA/IChpcCsoaXBudW0mJmlwbnVtIT1pcD8iICgiK2lwbnVtKyIpIjoiIikpOiIiKSsKKyAgICAgICAgKHN0cmluZ3AocHJvcGVydGllc1tQX0xPQ0FUSU9OXSkgPworICAgICAgICAgKHdpeiA/ICJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsiOiAiIikKKyAgICAgICAgICtjYXBpdGFsaXplKHByb3BlcnRpZXNbUF9MT0NBVElPTl0pKyIgKHVlYmVyICIrY291bnRyeShpcCwgaXBudW0pKyIpIjoKKyAgICAgICAgICh3aXo/IiBbIjoiIikrY291bnRyeShpcCwgaXBudW0pKSsod2l6ID8gIl0iOiIiKSsiLlxuIisKKyAgICAgICAgIlp1bGV0enQgYXVzZ2Vsb2dndDogIitkdGltZShsYXN0KSsiICgiK3RpbWVkaWZmKHRpbWUoKS1sYXN0KSsiKS5cbiI7CisgIH0KKyAgZWxzZSB7CisgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IG5pY2h0IGFud2VzZW5kLlxuWnVsZXR6dCBlaW5nZWxvZ2d0IHZvbjogIisKKyAgICAgICAgKHdpeiA/IChpcCsoaXBudW0mJmlwbnVtIT1pcD8iICgiK2lwbnVtKyIpIjoiIikpOiIiKSsKKyAgICAgICAgKHN0cmluZ3AocHJvcGVydGllc1tQX0xPQ0FUSU9OXSkgPworICAgICAgICAgKHdpeiA/ICJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsiOiAiIikKKyAgICAgICAgICtjYXBpdGFsaXplKHByb3BlcnRpZXNbUF9MT0NBVElPTl0pKyIgKHVlYmVyICIrY291bnRyeShpcCwgaXBudW0pKyIpIjoKKyAgICAgICAgICh3aXo/IiBbIjoiIikrY291bnRyeShpcCwgaXBudW0pKSsod2l6ID8gIl0iOiIiKSsiLlxuIisKKyAgICAgICAgIlp1bGV0enQgYXVzZ2Vsb2dndDogIitkdGltZShsYXN0KSsiICgiK3RpbWVkaWZmKHRpbWUoKS1sYXN0KSsiKS5cbiI7CisgIH0KKyAgdGV4dCs9IlZvbGxlciBOYW1lOiAiKygoKGg9cHJvcGVydGllc1tQX1BSRVNBWV0pICYmIGghPSIiKSA/IGgrIiAiIDogIiIpKworICAgIGNhcGl0YWxpemUoKGg9cHJvcGVydGllc1tQX05BTUVdKSA/IGggOiBzdHIpKyIgIisKKyAgICAgKChoPXByb3BlcnRpZXNbUF9USVRMRV0pID8gaCA6CisgICAgKChtYXBwaW5ncChoPXByb3BlcnRpZXNbImd1aWxkX3RpdGxlIl0pICYmIChoPShoW3Byb3BlcnRpZXNbUF9HVUlMRF0/cHJvcGVydGllc1tQX0dVSUxEXToiYWJlbnRldXJlciJdKSkgKSA/IGggOiAiIikgKQorICAgICAgICsiXG4iOworCisgIGlmIChwcm9wZXJ0aWVzW1BfR0hPU1RdKSB0ZXh0Kz0iSG9wcGxhLCBlaW4gR2Vpc3QhXG4iOworICBpZiAoKGZsYWdzJkZMQUdfTE9ORykmJnByb3BlcnRpZXNbUF9MT05HXSkKKyAgICB0ZXh0Kz0iQmVzY2hyZWlidW5nOiBcbiIrYnJlYWtfc3RyaW5nKHByb3BlcnRpZXNbUF9MT05HXSw3OCwyKTsKKworICBpZih3aXogfHwKKyAgICAgKHByb3BlcnRpZXNbUF9TSE9XRU1BSUxdPT0iYWxsZSIpIHx8CisgICAgICggKHByb3BlcnRpZXNbUF9TSE9XRU1BSUxdPT0iZnJldW5kZSIpICYmCisgICAgICAgb2JqZWN0cChwbGF5ZXIpICYmCisgICAgICAgdGhpc19wbGF5ZXIoKSAmJgorICAgICAgIChvYj1wcmVzZW50KCJcblxiZmJhbmQiLHBsYXllcikpICYmCisgICAgICAgcG9pbnRlcnAodG1wPW9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikpICYmCisgICAgICAgcG9pbnRlcnAodG1wPXRtcFsxXSkgJiYKKyAgICAgICAobWVtYmVyKHRtcCxnZXR1aWQodGhpc19wbGF5ZXIoKSkpIT0tMSkpKSB0bXAgPSAxOworICBlbHNlIHRtcD0wOworCisKKyAgaWYgKCEoaD1wcm9wZXJ0aWVzW1BfUkFDRV0pICYmIHVzZXJpbmZvICYmIHBvaW50ZXJwKHVzZXJpbmZvKSAmJiBzaXplb2YodXNlcmluZm8pPjQgJiYKKyAgICAgIHN0cmluZ3AodXNlcmluZm9bNF0pICYmIHNpemVvZihoPW9sZF9leHBsb2RlKHVzZXJpbmZvWzRdLCIvIikpPjIpIHsKKyAgICBoPWNhcGl0YWxpemUoaFsyXSk7CisgICAgaD0oWyJIdW1hbiI6Ik1lbnNjaCIsIkR3YXJmIjoiWndlcmciLCJEYXJrZWxmIjoiRHVua2VsZWxmIiwiT3JjIjoiT3JrIl0pW2hdIHx8IGg7CisgIH0KKworICBpZiAoIXN0cmluZ3AoaCkpIGg9IjxrZWluZT4iOworCisgIHRleHQrPSJSYXNzZTogIitoKyIsICBHaWxkZTogIisKKyAgICAgICAgICAgICAgICAgICAgICgoaD1wcm9wZXJ0aWVzW1BfVklTSUJMRV9HVUlMRF0pP2NhcGl0YWxpemUoaCk6KChoPXByb3BlcnRpZXNbUF9HVUlMRF0pP2NhcGl0YWxpemUoaCk6IkFiZW50ZXVyZXIiKSkrCisgICAgICAgICAgICAgICAgICAgICAoKGg9cHJvcGVydGllc1tQX1ZJU0lCTEVfU1VCR1VJTERfVElUTEVdKT8iICgiK2NhcGl0YWxpemUoaCkrIikiOigoaD1wcm9wZXJ0aWVzW1BfU1VCR1VJTERfVElUTEVdKT8iICgiK2NhcGl0YWxpemUoaCkrIikiOiIiKSkrCisgICAgICAgICAgICAgICAgICAgICAiLCAgR2VzY2hsZWNodDogIisoeyJuZXV0cmFsID8hIiwibWFlbm5saWNoIiwid2VpYmxpY2giLCI8dmVyZGFtbXQgc2VsdHNhbT4ifSlbcHJvcGVydGllc1tQX0dFTkRFUl1dKyJcbiIrCisgICAgICAgICAgICAgICAgICAgICAgKHNlZXIgPyAiQWx0ZXI6ICIrdGltZWRpZmYoYWdlKkhCSU5UKSsiLCAgICIgOiAiIikrCisgICAgICAgICAgICAgICAgICAgICAgKHdpemxldmVsPj0xMD8iTWFnaWVybGV2ZWw6ICIrd2l6bGV2ZWwrCisgICAgICAgICAgKHdpemxldmVsPj1HT0RfTFZMPyIgKE11ZGdvdHQpIjpzdHI9PSJib2luZyI/IiAoTXVkZ290dCBhLkQuKSI6c3RyPT0ibXVhZGliIj8iIChBcG9zdG9saXNjaGVyIFZpc2l0YXRvcikiOndpemxldmVsPj1BUkNIX0xWTD8iIChFcnptYWdpZXIpIjpJU19ERVBVVFkoc3RyKT8iIChIaWxmc3NoZXJpZmYpIjp3aXpsZXZlbD49RUxERVJfTFZMPyIgKFdlaXNlcikiOndpemxldmVsPj1MT1JEX0xWTD8iIChSZWdpb25zbWFnaWVyKSI6d2l6bGV2ZWw+PVNQRUNJQUxfTFZMPyIgKEhpbGZzbWFnaWVyKSI6d2l6bGV2ZWw+PURPTUFJTk1FTUJFUl9MVkw/IiAoUmVnaW9uc21pdGFyYmVpdGVyKSI6d2l6bGV2ZWw+V0laQVJEX0xWTD8iIChWb2xsbWFnaWVyKSI6IiAoTGVocmxpbmcpIik6CisgICAgICAgICAgICAgICAgICAgICAgICgiU3BpZWxlcmxldmVsOiAiK3Byb3BlcnRpZXNbUF9MRVZFTF0rKCB3aXpsZXZlbCA/ICIgKFNlaGVyIitJTisiKSIgOiAiIiApKworICAgICAgICAgICAgICAgICAgICAgICAgKCgoaD1wcm9wZXJ0aWVzW1BfR1VJTERfTEVWRUxdKSAmJiBoPWhbcHJvcGVydGllc1tQX0dVSUxEXV0pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoIiwgICBHaWxkZW5sZXZlbDogIitoKSA6ICIiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICkpKygodXNlcmluZm8mJnBvaW50ZXJwKHVzZXJpbmZvKSk/CisgICAgICAgICAgICAgICAgICAgICAgICAoc3ByaW50ZigiXG5EYXR1bSBkZXMgZXJzdGVuIExvZ2luOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcmluZm9bNV0gPiAwKSA/IGR0aW1lKHVzZXJpbmZvWzVdKSA6ICJ2b3IgZGVtIDEwLiBOb3YgMTk5NSIpKToiIikrCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRtcCA/ICgiXG5FLU1haWwtQWRyZXNzZTogIisoKGg9cHJvcGVydGllc1tQX01BSUxBRERSXSkgPyBoIDogImtlaW5lIikrIlxuIikgOiAiXG4iKTsKKworICBpZiAocHJvcGVydGllc1tQX0hPTUVQQUdFXSkKKyAgICB0ZXh0Kz0iSG9tZXBhZ2U6ICIrcHJvcGVydGllc1tQX0hPTUVQQUdFXSsiXG4iOworCisgIGlmIChzdHJpbmdwKGRhdGE9cHJvcGVydGllc1tQX01FU1NFTkdFUl0pKSB7CisgICAgdGV4dCs9c3ByaW50ZigiTWVzc2VuZ2VyOiAlcyIsIGRhdGEpOworICAgIGlmIChpbnRwKGRhdGE9cHJvcGVydGllc1tQX0lDUV0pKSB7CisgICAgICBpZiAoZGF0YTwwICYmIElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSkgZGF0YSo9LTE7CisgICAgICBpZiAoZGF0YT4wKSB0ZXh0ICs9IHNwcmludGYoIiwgSUNROiAlZCIsIGRhdGEpOworICAgIH0KKyAgICB0ZXh0Kz0iXG4iOworICB9IGVsc2UgCisgICAgaWYgKGludHAoZGF0YT1wcm9wZXJ0aWVzW1BfSUNRXSkpIHsKKyAgICAgIGlmIChkYXRhPDAgJiYgSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpKQorICAgICAgICBkYXRhKj0tMTsKKyAgICAgIGlmIChkYXRhPjApCisgICAgICAgIHRleHQrPXNwcmludGYoIklDUTogJWRcbiIsZGF0YSk7CisgICAgfQorCisgIGlmIChwcm9wZXJ0aWVzW1BfTUFSUklFRF0pCisgICAgdGV4dCs9IlZlcmhlaXJhdGV0IG1pdDogIitjYXBpdGFsaXplKHByb3BlcnRpZXNbUF9NQVJSSUVEXSkrIlxuIjsKKworICBpZiAoIHBvaW50ZXJwKHByb3BlcnRpZXNbUF9TSUJMSU5HU10pICkKKyAgICAgIHRleHQgKz0gKHsgIkVzIiwgIkVyIiwgIlNpZSIgfSlbcHJvcGVydGllc1tQX0dFTkRFUl1dICsgIiBpc3QgQmx1dHMiICsKKyAgICAgICAgICAoeyAidmVyd2FuZHQgbWl0ICIsICJicnVkZXIgdm9uICIsICJzY2h3ZXN0ZXIgdm9uICIgfSkKKyAgICAgICAgICBbcHJvcGVydGllc1tQX0dFTkRFUl1dICsKKyAgICAgICAgICBDb3VudFVwKHByb3BlcnRpZXNbUF9TSUJMSU5HU10pICsgIi5cbiI7CisKKyAgdGV4dCs9YXdheTsKKyAgCisgIGlmKE1BU1RFUi0+Y2hlY2tfbGF0ZV9wbGF5ZXIoc3RyKSkKKyAgeworICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGhhdCB1bnMgbGVpZGVyIGZ1ZXIgaW1tZXIgdmVybGFzc2VuLlxuIjsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoaD1NQVNURVItPlF1ZXJ5VEJhbmlzaGVkKHN0cikpCisgICAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiB3aWxsIGZydWVoZXN0ZW5zICIraFtUQkFOSVNIX0VYVFJBQ1RdOworICB9CisgIAorICBpZiAoaD1wcm9wZXJ0aWVzW1BfVEVTVFBMQVlFUl0pCisgIHsKKyAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBpc3QgVGVzdHNwaWVsZXIiK0lOOworICAgIGlmIChzdHJpbmdwKGgpKSB0ZXh0Kz0iICgiK2grIikiOworICAgIHRleHQrPSIuXG4iOworICB9CisgIGlmICggaD1wcm9wZXJ0aWVzW1BfU0VDT05EXSkKKyAgeworICAgIGlmIChJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpIHsKKyAgICAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBpc3QiOworICAgICAgIHN3aXRjaCgoaW50KXByb3BlcnRpZXNbUF9TRUNPTkRfTUFSS10pIHsKKyAgICAgICAgIGNhc2UgLTE6IHRleHQrPSIgdW5zaWNodGJhciBtYXJraWVydGUiCisgICAgICAgICAgICAgICAgICAgICAgICsoKGludClwcm9wZXJ0aWVzW1BfR0VOREVSXSE9RkVNQUxFID8gInIiOiAiIik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgIDA6IHRleHQrPSIgbmljaHQgbmFtZW50bGljaCBtYXJraWVydGUiCisgICAgICAgICAgICAgICAgICAgICAgICsoKGludClwcm9wZXJ0aWVzW1BfR0VOREVSXSE9RkVNQUxFID8gInIiOiAiIik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgfQorICAgICAgIHRleHQrPSIgWndlaXRzcGllbGVyIitJTjsKKyAgICAgICBpZiAoc3RyaW5ncChoKSkKKyAgICAgICAgIHRleHQrPSIgKCIrY2FwaXRhbGl6ZShoKSsiKSI7CisgICAgICAgdGV4dCs9Ii5cbiI7CisgICAgfQorICAgIGVsc2UgaWYgKChpbnQpcHJvcGVydGllc1tQX1NFQ09ORF9NQVJLXT4wKQorICAgIHsKKyAgICAgIHRleHQrPWNhcGl0YWxpemUoc3RyKSsiIGlzdCBad2VpdHNwaWVsZXIiK0lOOworICAgICAgaWYgKHN0cmluZ3AoaCkpCisgICAgICAgIHRleHQrPSIgKCIrY2FwaXRhbGl6ZShoKSsiKSI7CisgICAgICB0ZXh0Kz0iLlxuIjsKKyAgICB9CisgICAgZWxzZSBpZiAoKGludClwcm9wZXJ0aWVzW1BfU0VDT05EX01BUktdPi0xKQorICAgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IFp3ZWl0c3BpZWxlciIrSU4rIi5cbiI7CisgIH0KKyAgaWYgKHByb3BlcnRpZXNbUF9ERUFEU10pCisgIHsKKyAgICB0ZXh0Kz0iQmlzaGVyIGJlcmVpdHMgIitwcm9wZXJ0aWVzW1BfREVBRFNdKyIgbWFsIGdlc3RvcmJlblxuIjsKKyAgICAvLyBCZXppZWh0IHNpY2ggbnVyIGF1ZiBkZW4gWmVpdHJhdW0gYWIgZGVtIDMwLjExLic5NAorICB9CisgIGlmKGhjX3BsYXk9PTEpCisgIHsKKyAgICB0ZXh0Kz1jYXBpdGFsaXplKHN0cikrIiBpc3Qgc2VociBtdXRpZy5cbiI7CisgIH0KKyAgaWYoaGNfcGxheT4xKQorICB7CisgICAgdGV4dCs9Y2FwaXRhbGl6ZShzdHIpKyIgaXN0IGFtICIrZHRpbWUoaGNfcGxheSkrIiBpbiBkYXMgTmlydmFuYSBlaW5nZWdhbmdlbi5cbiI7CisgIH0KKworICBpZiAoLyp3aXogJiYgKi91c2VyaW5mbykgeworICAgIGRhdGE9dXNlcmluZm9bM107CisgICAgaWYgKHNpemVvZihkYXRhKSkKKyAgICAgIHRleHQrPSJSZWdpb25zbWFnaWVyIitJTisiIHZvbiAgICAgOiAiK2ltcGxvZGUobWFwKGRhdGEsIydjYXBpdGFsaXplKSwiLCAiKSsiLlxuIjsKKyAgICBkYXRhPSIvc2VjdXJlL21hc3RlciItPmdldF9kb21haW5faG9tZXMoc3RyKTsKK2RhdGE9ZmlsdGVyKGRhdGEtKHsiZXJ6bWFnaWVyIn0pLCMnc3RyaW5ncCk7IAorICAgIGlmICgod2l6bGV2ZWw+PURPTUFJTk1FTUJFUl9MVkwpICYmIChzaXplb2YoZGF0YSkpKQorICAgICAgdGV4dCs9IlJlZ2lvbnNtaXRhcmJlaXRlciIrSU4rIiB2b246ICIraW1wbG9kZShtYXAoZGF0YSwjJ2NhcGl0YWxpemUpLCIsICIpKyIuXG4iOyAgLyogIycgKi8gCisgICAgfQorCisgIGlmICh1c2VyaW5mbykgeworICAgIGRhdGE9dXNlcmluZm9bOF07CisgICAgaWYgKHNpemVvZihkYXRhKSkKKyAgICAgIHRleHQgKz0gIkdpbGRlbm1hZ2llciIrSU4rIiB2b24gICAgICA6ICIraW1wbG9kZShtYXAoZGF0YSwgIydjYXBpdGFsaXplKSwgIiwgIikrIi5cbiI7ICAgLyogIycgKi8KKyAgfQorCisgIC8vIGdnZi4gQXZhdGFyLVVSSSBtaXQgYXVzZ2ViZW4uCisgIGlmIChmbGFncyAmIEZMQUdfQVZBVEFSCisgICAgICAmJiBzdHJpbmdwKHByb3BlcnRpZXNbUF9BVkFUQVJfVVJJXSkpCisgICAgdGV4dCArPSAiQXZhdGFyLVVSSTogIiArIHByb3BlcnRpZXNbUF9BVkFUQVJfVVJJXSArICJcbiI7CisKKyAgaWYgKGZsYWdzICYgRkxBR19TUE9OU09SKQorICAgIHRleHQrPXNwb25zb3Jpbmcoc3RyKTsKKworICBmaWxlbmFtZT0iL3BsYXllcnMvIitzdHIrIi8ucHJvamVjdCI7CisgIGlmKGZpbGVfc2l6ZShmaWxlbmFtZSk+PTApCisgICAgdGV4dCs9IlByb2pla3Q6ICIrZXhwbG9kZShyZWFkX2ZpbGUoZmlsZW5hbWUpLCAiXG4iKVswXSsiXG4iOworICBlbHNlIHsKKyAgICBmaWxlbmFtZT0iL3Avc2VydmljZS9sb2NvL3BsYW5zLyIrc3RyKyIucHJvamVjdCI7CisgICAgaWYoZmlsZV9zaXplKGZpbGVuYW1lKT49MCkKKyAgICAgIHRleHQrPSJQcm9qZWt0OiAiK2V4cGxvZGUocmVhZF9maWxlKGZpbGVuYW1lKSwgIlxuIilbMF0rIlxuIjsKKyAgfQorICBpZiAoc2VlciAmJiAhKGZsYWdzJkZMQUdfTk9QTEFOKSkgeworICAgIGZpbGVuYW1lPSIvcGxheWVycy8iK3N0cisiLy5wbGFuIjsKKyAgICBpZihmaWxlX3NpemUoZmlsZW5hbWUpPj0wKQorICAgICAgdGV4dCs9IlBsYW46XG4iK3JlYWRfZmlsZShmaWxlbmFtZSk7CisgICAgZWxzZSB7CisgICAgICBmaWxlbmFtZT0iL3Avc2VydmljZS9sb2NvL3BsYW5zLyIrc3RyKyIucGxhbiI7CisgICAgICBpZihmaWxlX3NpemUoZmlsZW5hbWUpPj0wKQorICAgICAgICB0ZXh0Kz0iUGxhbjpcbiIrcmVhZF9maWxlKGZpbGVuYW1lKTsKKy8vICAgICAgZWxzZQorLy8gICAgICB0ZXh0Kz0iS2VpbmUgLnBsYW4tRGF0ZWkuXG4iOworICAgIH0KKyAgfQorICBwcm9wZXJ0aWVzPTA7CisgIGlmICghbG9jYWwpCisgICAgcmV0dXJuIHRleHQ7CisgIHRoaXNfcGxheWVyKCktPk1vcmUodGV4dCk7CisgIHJldHVybiAiIjsKK30KKworc3RyaW5nIEZpbmdlcihzdHJpbmcgc3RyKQoreworICBpZighc3RyIHx8IHN0cj09IiIpIHsgbm90aWZ5X2ZhaWwoIldlbiBkZW5uP1xuIik7IHJldHVybiAwOyB9CisgIGVsc2UKKyAgICByZXR1cm4gZmluZ2VyX3NpbmdsZShzdHIsMSk7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi9maXNobWFzdGVyLmMgYi9wL2RhZW1vbi9maXNobWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5NzU4NAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL2Zpc2htYXN0ZXIuYwpAQCAtMCwwICsxLDE2NSBAQAorLypGaXNjaC1NYXN0ZXIsIChjKSBWYW5pb25ATUcsIDI2LjA1LjAyCisKKyAgRmlzY2hlIGRpZSBpbSBNRyBnZWFuZ2VsdCB3ZXJkZW4ga29lbm5lbiwgc29sbGVuIG5pY2h0IGFscyBlbmRsb3NlCisgIEdlbGRxdWVsbGUgZGllbmVuLiBEYWhlciBoYWJlIGljaCBlaW5lbiBNYXN0ZXIgZ2ViYXV0LCBkZXIgc2ljaCBtZXJrdAorICBXZWxjaGVyIFNwaWVsZXIgd2lldmllbCBGaXNjaCBnZWFuZ2VsdCBoYXQuIEplIG1laHIgRmlzY2ggZGVyIFNwaWVsZXIKKyAgZmFlbmd0LCBkZXN0byBiaWxsaWdlciB3aXJkIGRlciBGaXNjaC4KKworICBTY2huaXR0c3RlbGxlOgorCisgIERlciBNYXN0ZXIgaGF0IGFiZ2VzZWhlbiB2b24gU3RhbmRhcmQtRnVua3Rpb25lbiBudXIgZWluZSBTY2huaXR0c3RlbGxlCisKKyAgcHVibGljIGludCBQcmljZU9mRmlzaChvYmplY3QgcGxheWVyLCBvYmplY3QgZmlzaCkKKworICBEZXIgZXJzdGUgUGFyYW1ldGVyIGlzdCBkZXIgU3BpZWxlciwgZGVyIGRlbiBGaXNjaCBnZWNsb25lZCBoYXQsIGRlcgorICB6d2VpdGUgaXN0IGRlciBGaXNjaCwgZGVuIGRlciBTcGllbGVyIGdlZmFuZ2VuIGhhdC4gRGVyIEZpc2NoIG11c3MKKyAgaGllcmJlaSB2b24gRnJhZ2dsZXMgU3RhbmRhcmRmaXNjaCBlcmJlbi4KKworICBEZXIgUHJlaXMgZGVzIEZpc2NoZXMgZmFlbGx0IGxpbmVhciBqZSBuYWVoZXIgZGVyIFNwaWVsZXIgYW4gZGllCisgIE1heGltYWwtR3JlbnplIGZ1ZXIgRmlzY2gga29tbXQgKERpZXNlIGlzdCBkdXJjaCBkaWUgS29uc3RhbnRlIE1BWF9GSVNICisgIGZlc3RnZWxlZ3QuKSBEZXIgTWFzdGVyIG1lcmt0IHNpY2ggdWViZXIgZWluZW4gWmVpdHJhdW0gdm9uIEZPUkdFVF9JVAorICBTZWt1bmRlbiwgZGFzcyBkZXIgU3BpZWxlciBkaWVzZW4gRmlzY2ggZ2VmYW5nZW4gaGF0LiBJc3QgZGVyIFplaXRyYXVtCisgIHZlcmdhbmdlbiwgZ2VodCBkZXIgRmlzY2ggbmljaHQgbWVociBpbiBkaWUgUmVjaG51bmcgZWluLgorICovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLCBub19zaGFkb3csIG5vX2luaGVyaXQKKworI2RlZmluZSBTQVZFX0ZJTEUgX19ESVJfXysic2F2ZS9maXNoZXMiCisKKyNkZWZpbmUgRk9SR0VUX0lUIDE3MjgwMDAgLy8gTmFjaCAyMCBUYWdlbgorI2RlZmluZSBNQVhfRklTSCAgMjAwMDAgICAvLyBXZW5uIFNwaWVsZXIgTWF4LUZpc2ggZ2Vob2x0IGhhdCwgaGF0IGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXNjaCBrZWluZW4gV2VydCBtZWhyLiAoRWluaGVpdCBHcmFtbSkKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworLy8gSGllciB3aXJkIGdlc3BlaWNoZXJ0LCB3ZWxjaGVyIFNwaWVsZXIgd2lldmllbCBGaXNjaCBnZWZhbmdlbiBoYXQuCittYXBwaW5nIGZpc2hlcyA9IG1fYWxsb2NhdGUoMCwxKTsKK3N0YXRpYyBpbnQgc2F2ZV9tZV9zb29uOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIC8vIE9obmUgZGFzIGRhcmYgZGllc2VzIE9iamVrdCBoaWVyIG5pY2h0IHNjaHJlaWJlbi4KKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIC8vIEdsb2JhbGUgVmFyaWFibGVuIGVpbmxlc2VuL2luaXRpYWxpc2llcmVuLgorICByZXN0b3JlX29iamVjdChTQVZFX0ZJTEUpOworICBzZXRfbmV4dF9yZXNldCg0KjM2MDApOworfQorCitzdGF0aWMgdm9pZCBDbGVhbnVwRGF0YSgpIHsKKyAgaW50IGV4cGlyZV9kYXRlID0gdGltZSgpLUZPUkdFVF9JVDsKKyAgLy8gVWViZXIgYWxsZSBTcGllbGVybmFtZW4gbGF1ZmVuLgorICBmb3JlYWNoKHN0cmluZyBwbCwgbWl4ZWQgKmZpc2hsaXN0OiBmaXNoZXMpIHsKKyAgICAvLyBVZWJlciBhbGxlIEZpc2NoZGF0ZW4gYWxsZXIgU3BpZWxlciBsYXVmZW4uCisgICAgZm9yZWFjaChpbnQgKmZpc2g6IGZpc2hsaXN0KSB7CisgICAgICBpZiAoZmlzaFswXTxleHBpcmVfZGF0ZSkgeworICAgICAgICBmaXNobGlzdC09KHtmaXNofSk7CisgICAgICAgIHNhdmVfbWVfc29vbj0xOworICAgICAgfQorICAgIH0KKyAgICBpZiAoICFzaXplb2YoZmlzaGxpc3QpICkKKyAgICAgIGZpc2hlcyA9IG1fZGVsZXRlKGZpc2hlcywgcGwpOworICAgIGVsc2UKKyAgICAgIGZpc2hlcyArPSAoW3BsOmZpc2hsaXN0XSk7CisgIH0KK30KKworLy9aWjogbWFuIGtvZW5udGUgaGllciBnZ2YuIGRhcyBuZXVlIEdld2ljaHQgYmVzdGltbWVuIHN0YXR0IGVzIGJlaSBqZWRlbQorLy9aWjpBYnJ1ZiB6dSB0dW4uCisvLyBGdWVndCBlaW5lbiBuZXVlbiBGaXNjaCBpbiBkaWUgTGlzdGUgbWl0IEZpc2NoZW4gZWluCitzdGF0aWMgaW50IEFkZEZpc2goc3RyaW5nIHBsYXllcl9pZCwgaW50IHdlaWdodCkgeworICAvLyBGaXNjaCBoaW56dWZ1ZWdlbgorICBpZiAoIG1lbWJlcihmaXNoZXMsIHBsYXllcl9pZCkgKQorICAgIGZpc2hlc1twbGF5ZXJfaWRdICs9ICAoeyh7IHRpbWUoKSx3ZWlnaHR9KX0pOworICBlbHNlIAorICAgIGZpc2hlcyArPSAoWyBwbGF5ZXJfaWQ6ICh7ICh7dGltZSgpLHdlaWdodH0pIH0pIF0pOworICByZXR1cm4gMTsKK30KKworLy8gSGllciB3aXJkIGRhcyBHZXdpY2h0IGRlcyBiZXJlaXRzIGdlZmFuZ2VuZW4gRmlzY2hlcyB1bWdld2FuZGVsdAorLy8gaW4gZGVuIFByZWlzLVByb3plbnRzYXR6LCBkZW4gZGVyIEZpc2NoIG5vY2gga29zdGV0Lgorc3RhdGljIGludCBXZWlnaHRUb1ByaWNlKGludCB3ZWlnaHQpIHsKKyAgaWYgKHdlaWdodCA+PSBNQVhfRklTSCkgcmV0dXJuIDA7CisgIGlmICh3ZWlnaHQgPD0gMCAgICAgICApIHJldHVybiAxMDA7CisgIC8vIEVpbmUgbGluZWFyZSBLdXJ2ZS4gSmUgbWVociBGaXNjaCBnZWhvbHQsIGRlc3RvIGJpbGxpZ2VyCisgIC8vIHdpcmQgZGVyLiAvLyBBcmF0aG9ybjogU3Bhbm5lbmQsIHNvIGVpbmUgbGluZWFyZSBLdXJ2ZS4gOi0pCisgIHJldHVybiAxMDAtKHdlaWdodCoxMDAvTUFYX0ZJU0gpOworfQorCisvLyBHaWJ0IGRhcyBHZXNhbXRnZXdpY2h0IGRlcyBnZWZhbmdlbmVuIEZpc2NoZXMgenVtIFNwaWVsZXIgenVydWVjaworc3RhdGljIGludCBRdWVyeVdlaWdodChzdHJpbmcgcGxheWVyX2lkKSB7CisgIGludCB3ZWlnaHQ7CisgIG1peGVkIGxpc3QgPSBmaXNoZXNbcGxheWVyX2lkXTsKKworICAvLyBFcnN0bWFsIHdlcmRlbiB1bmd1ZWx0aWdlIEZpc2NoZSBhdXMgZGVyIExpc3RlIGVudGZlcm50CisgIC8vWlo6IGljaCBmaW5kZSwgZGFzIG11c3MgbmljaHQgdW5iZWRpbmd0IGJlaSBqZWRlbiBBYnJ1ZiBnZXRhbiB3ZXJkZW4KKyAgLy9aWjo6dW5kIG5pY2h0IGZ1ZXIgYWxsZSBTcGllbGVyLiByZWljaHQgbmljaHQgZWluZmFjaCBhbGxlIDRoPyAKKyAgQ2xlYW51cERhdGEoKTsKKworICAvLyBadXNhbW1lbnphZWhsZW4gZGVyIEVpbnplbGdld2ljaHRlIGRlciBndWVsdGlnZW4gRmlzY2hlLgorICBmb3JlYWNoKGludCAqZmlzaCA6IGZpc2hlc1twbGF5ZXJfaWRdKSB7CisgICAgd2VpZ2h0ICs9IGZpc2hbMV07CisgIH0KKyAgcmV0dXJuIHdlaWdodDsKK30KKworLy8gV2VubiBlaW4gU3BpZWxlciBlaW5lbiBuZXVlbiBGaXNjaCBiZWtvbW10LCB3aXJkIGRlciBQcmVpcyBmdWVyIGRlbgorLy8gRmlzY2ggYmVzdGltbXQuIERpZXNlciByZXN1bHRpZXJ0IGF1cyBkZXIgTWVuZ2UgKEdld2ljaHQpIGRlcyBGaXNjaCwKKy8vIGRpZSBkZXIgU3BpZWxlciBpbiBsZXR6dGVyIFplaXQgc2Nob24gZ2VmYW5nZW4gaGF0LiBadXJ1ZWNrZ2VnZWJlbgorLy8gd2lyZCBkZXIgUHJlaXMgaW4gVGVpbGVuIHZvbiAxMDAuCitwdWJsaWMgaW50IFByaWNlT2ZGaXNoKG9iamVjdCBwbGF5ZXIsIG9iamVjdCBmaXNoKSB7CisgIHN0cmluZyBwbGF5ZXJfaWQ7CisgIGludCBwcmljZV9vZl9uZXdfZmlzaDsKKworICAvLyBTaW5kIFNwaWVsZXIgdW5kIEZpc2NoIHVlYmVyZ2ViZW4/CisgIGlmICggIXBsYXllciB8fCAhZmlzaCApIHJldHVybiAwOworCisgIC8vIFNwaWVsZXItSUQgZmluZGVuLgorICBwbGF5ZXJfaWQgPSBnZXR1dWlkKHBsYXllcik7CisKKyAgLy8gSXN0IHBsYXllciBlaW4gZWNodGVyIFNwaWVsZXI/CisgIC8vIE5QQyBjbG9uZW4gc2ljaCBGaXNjaGUsIGRpZSAxMDAlIGtvc3Rlbi4KKyAgaWYgKG1lbWJlcih1c2VycygpLHBsYXllcik9PS0xKSByZXR1cm4gMTAwOworCisgIC8vIElzIGRlciBGaXNjaCBlaW4gRmlzY2ggdm9uIEZyYWdnbGU/CisgIGlmIChtZW1iZXIoaW5oZXJpdF9saXN0KGZpc2gpLCBfX1BBVEhfXygxKSsiL2Zpc2guYyIpPT0tMSkKKyAgICByZXR1cm4gMDsKKworICAvLyBGZXN0c3RlbGxlbiB3aWV2aWVsIEZpc2NoIGVpbiBTcGllbGVyIGdlZmFuZ2VuIGhhdCwgdW5kCisgIC8vIGRhcmF1cyBkZW4gUHJlaXMgYmVyZWNobmVuLgorICBwcmljZV9vZl9uZXdfZmlzaCA9IFdlaWdodFRvUHJpY2UoUXVlcnlXZWlnaHQocGxheWVyX2lkKSk7CisKKyAgLy8gRGllc2VuIEZpc2NoIGluIGRpZSBEYXRlbmJhbmsgZWludHJhZ2VuCisgIEFkZEZpc2gocGxheWVyX2lkLCBmaXNoLT5RdWVyeVByb3AoUF9XRUlHSFQpKTsKKworICAvLyBJY2ggYmluIG5ldWdpZXJpZy4KKyAgLypERUJVRyhwbGF5ZXItPk5hbWUoKSsiIGhhdCBlaW5lbiBGaXNjaCBtaXQgIitmaXNoLT5RdWVyeVByb3AoUF9XRUlHSFQpKworICAgICAgICAiIGcgZ2VmYW5nZW4uIERlciBXZXJ0IGxpZWd0IGJlaSAiK3ByaWNlX29mX25ld19maXNoKyIlIik7Ki8KKworICAvLyBEaWUgQWVuZGVydW5nIHNvbGwgcGVyc2lzdGVudCBzZWluLgorICBzYXZlX21lX3Nvb249MTsKKworICAvLyBSdWVja2dhYmUgZGVzIEZpc2NocHJlaXNlcy4KKyAgcmV0dXJuIHByaWNlX29mX25ld19maXNoOworfQorCisvLyBTcGVpY2hlcm4gZGVyIGdsb2JhbGVuIFZhcmlhYmxlbgorc3RhdGljIHZvaWQgc2F2ZSgpIHsKKyAgc2F2ZV9vYmplY3QoU0FWRV9GSUxFKTsKKyAgcmV0dXJuOworfQorCisvLyBEYSBuaWNodHMgZ2VlcmJ0IHdpcmQsIG11c3MgZGFzIGRlc3RydWN0KCkgc2VsYnN0IGdlbWFjaHQgd2VyZGVuCisvLyBXaXIgc3BlaWNoZXJuIGF1ZiBqZWRlbiBGYWxsLgordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc2F2ZSgpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIERhdGVuIGF1ZnJhZXVtZW4gdW5kIGdnZi4gd2Vnc3BlaWNoZXJuCit2b2lkIHJlc2V0KCkgeworICBDbGVhbnVwRGF0YSgpOworICBpZiAoIHNhdmVfbWVfc29vbiApCisgICAgc2F2ZSgpOworICBzZXRfbmV4dF9yZXNldCg0KjM2MDApOyAvLyBhbGxlIDQgU3R1bmRlbiByZWljaHQuCit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi9pcGxvb2t1cC5jIGIvcC9kYWVtb24vaXBsb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vaXBsb29rdXAuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIE11ZGxpYnNlaXRlIGRlcyBpcGxvb2t1cCBzeXN0ZW1zLCBtaXQgZGVtIGF1cyBudW1lcmlzY2hlbiBJUCBBZHJlc3NlbgorICogZGVyIEhvc3RuYW1lIHVuZCBkZXIgT3J0LCBhbiBkZW0gc2ljaCBkZXIgUmVjaG5lciBiZWZpbmRlbiBiZXJlY2huZXQgd2lyZC4KKyAqIEVyZ2Vibmlzc2Ugd2VyZGVuIGdlY2FjaGV0LgorICoKKyAqIChjKTIwMTAgcnVtYXRhIEAgbW9yZ2VuZ3JhdWVuCisgKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworLy8gRm9ybWF0IGRlciBpcG1hcDoKKy8vIEtleTogbnVtZXJpc2NoZSBpcCBhbHMgc3RyaW5nIChvaG5lIGZ1ZWhyZW5kZSBudWxsZW4pCisvLyBEYXRhOgorLy8gIFtpcCwwXSBIb3N0bmFtZSwgZGVyIHZvbSBleHRlcm5lbiBTZXJ2ZXIgZ2VsaWVmZXJ0IHd1cmRlLgorLy8gIFtpcCwxXSBMb2NhdGlvbmluZm9ybWF0aW9uLCBkaWUgdm9tIGV4dGVybmVuIFNlcnZlciBrb21tdC4KKy8vICAgIGRpZXNlciBzb2xsdGUgZGVuIE9ydCwgb2RlciBmYWxscyBlcyBuaWNodCBiZXNzZXIgZ2VodCwgZGFzIExhbmQKKy8vICAgIGltIEtsYXJ0ZXh0IGxpZWZlcm4uCisvLyAgW2lwLDJdIFplaXRzdGVtcGVsLCBiZWkgZGVzc2VuIGVycmVpY2hlbiBkZXIgV2VydCBnZWxvZXNjaHQgd2VyZGVuCisvLyAgICBzb2xsLgorLy8gIFtpcCwzXSBTdGF0dXMgZGVyIEFuZnJhZ2UKKworcHJpdmF0ZSBtYXBwaW5nIGlwbWFwOworI2RlZmluZSBJUE1BUF9IT1NUICAgMAorI2RlZmluZSBJUE1BUF9DSVRZICAgMQorI2RlZmluZSBJUE1BUF9FWFBJUkUgMgorI2RlZmluZSBJUE1BUF9TVEFUVVMgMworCisvLyBleHRlcm5lciBzZXJ2ZXIsIGRlciBkZXIgbG9rYXRpb25kYXRlbiBiZXJlY2huZXQKKyNkZWZpbmUgSVBMT09LVVBfSE9TVCAiMTI3LjAuMC4xIgorI2RlZmluZSBJUExPT0tVUF9QT1JUIDg3MTEKKyNkZWZpbmUgSVBMT09LVVBfU0FWRSAiL3AvZGFlbW9uL3NhdmUvaXBsb29rdXAiCisKKy8vIG1vZWdsaWNoZSBzdGF0dXN3ZXJ0ZSAocGxhdHogenVtIHphZWhsZW4gZGVyIGFuZnJhZ2VuIGdlbGFzc2VuKQorI2RlZmluZSBTVEFUVVNfUVVFUllJTkcgICAgICAxCisjZGVmaW5lIFNUQVRVU19BVVRIT1JJVEFUSVZFIDEyOAorCisvLyBzbyBsYW5nZSB3ZXJkZW4gZGllIGRhdGVuIGltIGNhY2hlIGdlaGFsdGVuCisjZGVmaW5lIENBQ0hFX1RJTUUgICAgODY0MDAgIC8qIDEgZGF5ICovCisKKy8vIEFiIGRpZXNlciBHcm9lc3NlIGJldHJhY2hlIGljaCBkZW4gY2FjaGUgYWxzICJncm9zcyBnZW51ZyIsCisvLyB1bSBlaW5lbiBjYWNoZSB1cGRhdGUgaW4gZXRhcHBlbiB6dSByZWNodGZlcnRpZ2VuLgorI2RlZmluZSBMQVJHRV9DQUNIRV9MSU1JVCAyMDAwCisKKy8vIHNvIGxhbmdlIHNpbmQgd2lyIGJlcmVpdCBhdWYgZGllIGFudHdvcnQgZWluZXIgYW5mcmFnZSBiZWltIHNlcnZlciB6dSB3YXJ0ZW4KKyNkZWZpbmUgUVVFUllfVElNRSAgICA2MCAgICAgLyogMSBtaW4gKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIE1VRE5BTUUgPT0gIk1vcmdlbkdyYXVlbiIKKyNkZWZpbmUgTE9HKHgpIGxvZ19maWxlKCJydW1hdGEvaXBsb29rdXAubG9nIixzdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVM6ICIpKyh4KSsiXG4iKQorI2Vsc2UKKyNkZWZpbmUgTE9HKHgpCisjZW5kaWYKKworLy8gUFJPVE9UWVBFUworCitwdWJsaWMgdm9pZCBjcmVhdGUoKTsKK3B1YmxpYyB2b2lkIHJlc2V0KCk7CitzdGF0aWMgaW50IGFjdGl2ZV9lbnRyeSggc3RyaW5nIGtleSwgbWl4ZWQqIGRhdGEgKTsKK3N0YXRpYyB2b2lkIGV4cGlyZV9jYWNoZV9zbWFsbCgpOworc3RhdGljIHZvaWQgZXhwaXJlX2NhY2hlX2xhcmdlKCBzdHJpbmcqIGtleXMgKTsKK3B1YmxpYyB2b2lkIHVwZGF0ZSggc3RyaW5nIHVkcF9yZXBseSApOworCisvLyBJTVBMRU1FTlRBVElPTgorCitwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJc2V0ZXVpZChnZXR1aWQoKSk7CisJcmVzdG9yZV9vYmplY3QoIElQTE9PS1VQX1NBVkUgKTsKKworCWlmKCAhbWFwcGluZ3AoaXBtYXApIHx8IHdpZHRob2YoaXBtYXApIT00ICkgeworCQlpcG1hcCA9IG1fYWxsb2NhdGUoIDAsIDQgKTsKKwkJTE9HKCJyZXN0b3JlIGZhaWxlZCwgY3JlYXRpbmcgbmV3IGlwbWFwIik7CisJfSBlbHNlIHsKKwkgIExPRyhzcHJpbnRmKCJjcmVhdGVkICglZCBlbnRyaWVzKSIsc2l6ZW9mKGlwbWFwKSkpOworCX0KK30KKworcHVibGljIHZvaWQgcmVzZXQoKSB7CisJaWYoIHNpemVvZihpcG1hcCkgPCBMQVJHRV9DQUNIRV9MSU1JVCApIHsKKwkJZXhwaXJlX2NhY2hlX3NtYWxsKCk7CisJfSBlbHNlIHsKKwkJTE9HKHNwcmludGYoInJlc2V0ICVkIC0+IixzaXplb2YoaXBtYXApKSk7CisJCWV4cGlyZV9jYWNoZV9sYXJnZSggbV9pbmRpY2VzKGlwbWFwKSApOworCX0KKyAgc2V0X25leHRfcmVzZXQoMTA4MDApOworfQorCitzdGF0aWMgaW50IGFjdGl2ZV9lbnRyeSggc3RyaW5nIGtleSwgbWl4ZWQqIGRhdGEgKSB7CisJcmV0dXJuIHRpbWUoKSA8IGRhdGFbSVBNQVBfRVhQSVJFXTsKK30KKworLy8gRGVuIGNhY2hlIGF1ZiBlaW5mYWNoZSB3ZWlzZSBhdWZyYWV1bWVuLgorc3RhdGljICB2b2lkIGV4cGlyZV9jYWNoZV9zbWFsbCgpIHsKKwlpbnQgcyA9IHNpemVvZihpcG1hcCk7CisJaXBtYXAgPSBmaWx0ZXIoIGlwbWFwLCAjJ2FjdGl2ZV9lbnRyeSApOworCXNhdmVfb2JqZWN0KCBJUExPT0tVUF9TQVZFICk7CisJTE9HKHNwcmludGYoInJlc2V0ICglZCAtPiAlZCkiLHMsc2l6ZW9mKGlwbWFwKSkpOworfQorCisvLyBLb21wbGl6aWVydGVyZSByb3V0aW5lLCBkaWUgZGVuIGNhY2hlIGV0YXBwZW53ZWlzZSBhYmFyYmVpdGV0Lgorc3RhdGljCXZvaWQgZXhwaXJlX2NhY2hlX2xhcmdlKCBzdHJpbmcqIGtleXMgKSB7CisJaWYoICFwb2ludGVycChrZXlzKSApIHJldHVybjsKKwlpbnQgbmV4dD0wOworCWZvcmVhY2goIHN0cmluZyBrZXk6IGtleXMgKSB7CisJCWlmKCBnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDAgKSBicmVhazsKKwkJaWYoIGlwbWFwW2tleSxJUE1BUF9FWFBJUkVdIDwgdGltZSgpICkgeworCQkJbV9kZWxldGUoIGlwbWFwLCBrZXkgKTsKKwkJfQorCQluZXh0Kys7CisJfQorCUxPRyhzcHJpbnRmKCJjaGVja2luZyAlZCBvZiAlZCIsbmV4dCxzaXplb2Yoa2V5cykpKTsKKwlpZiggbmV4dDxzaXplb2Yoa2V5cykgKSB7CisJCWNhbGxfb3V0KCAjJ2V4cGlyZV9jYWNoZV9sYXJnZSwgNiwga2V5c1tuZXh0Li5dICk7CisJfSBlbHNlIHsKKwkJc2F2ZV9vYmplY3QoIElQTE9PS1VQX1NBVkUgKTsKKwkJTE9HKHNwcmludGYoInJlc2V0IC0+ICVkIChkb25lKSIsc2l6ZW9mKGlwbWFwKSkpOworCX0KK30KKworI2RlZmluZSBTRUFSQ0hJTkcgIjxhdWYgZGVyIFN1Y2hlLi4uPiIKKworLyogRXJ6ZXVndCBlaW5lbiB0ZW1wb3JhZXJlbiBFaW50cmFnLCBkZXIgZnVlciBlaW5lIFN1Y2hlIHN0ZWh0LgorICogV2VubiBkaWUgQW50d29ydCBrb21tdCwgd2lyZCBkZXIgRWludHJhZyBtaXQgZGVuIGVudGd1ZWx0aWdlbgorICogRGF0ZW4gdWViZXJzY2hyaWViZW4uCisgKi8KK3N0YXRpYyB2b2lkIG1ha2VfcmVxdWVzdCggc3RyaW5nIGlwbnVtICkgeworCXNlbmRfdWRwKCBJUExPT0tVUF9IT1NULCBJUExPT0tVUF9QT1JULCBpcG51bSApOworCWlwbWFwICs9IChbIGlwbnVtIDogaXBudW0gOyBTRUFSQ0hJTkcgOworCQl0aW1lKCkrUVVFUllfVElNRSA7IFNUQVRVU19RVUVSWUlORworCV0pOworfQorCisvKiBMaWVmZXJ0IHp1IGVpbmVyIGdlZ2ViZW5lbiBpcG51bSBkZW4gT3J0LgorICogZGllc2UgRnVua3Rpb24gd2lyZCB2b24gc2ltdWxfZWZ1biBhdWZnZXJ1ZmVuLgorICogQHBhcmFtIGlwbnVtIGVpbmUgbnVtZXJpc2NoZSBpcC1hZHJlc3NlIG9kZXIgZWluIGludGVyYWN0aXZlCisgKiBAcmV0dXJuIGRlbiBPcnQgKG9kZXIgZGFzIExhbmQpIGluIGRlbSBzaWNoIGRpZSBpcC1hZHJlc3NlCisgKiBsYXV0IGV4dGVybmVtIFNlcnZlciBiZWZpbmRldC4KKyAqLworcHVibGljIHN0cmluZyBjb3VudHJ5KCBtaXhlZCBpcG51bSApIHsKKwlzdHJpbmcgaG9zdCxjaXR5OworCWludCBleHBpcmUsc3RhdGU7CisKKwlpZiggb2JqZWN0cChpcG51bSkgKSB7CisJCWlwbnVtID0gcXVlcnlfaXBfbnVtYmVyKGlwbnVtKTsKKwl9CisJaWYoICFzdHJpbmdwKGlwbnVtKSApIHsKKwkJcmV0dXJuICI8dW5kZWZpbmVkPiI7CisJfQorCWlmKCAhbV9jb250YWlucyggJmhvc3QsICZjaXR5LCAmZXhwaXJlLCAmc3RhdGUsIGlwbWFwLCBpcG51bSApICkgeworCQltYWtlX3JlcXVlc3QoIGlwbnVtICk7CisJCXJldHVybiBTRUFSQ0hJTkc7CisJfQorCisJcmV0dXJuIGNpdHk7Cit9CisKKy8qIExpZWZlcnQgenUgZWluZXIgZ2VnZWJlbmVuIGlwbnVtIGRlbiBIb3N0bmFtZW4uCisgKiBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiBzaW11bF9lZnVuIGF1ZmdlcnVmZW4uCisgKiBAcGFyYW0gaXBudW0gZWluZSBudW1lcmlzY2hlIGlwLWFkcmVzc2Ugb2RlciBlaW4gaW50ZXJhY3RpdmUKKyAqIEByZXR1cm4gZGVuIEhvc3RuYW1lbiBkZXIgenUgZGVyIGFuZ2VnZWJlbmVuIGlwLWFkcmVzc2UgZ2Vob2VydC4KKyAqIHdlbm4gZGVyIGhvc3RuYW1lIG5pY2h0IGJla2FubnQgaXN0LCB3aXJkIGRpZSBpcGFkcmVzc2UgenVydWVja2dlZ2ViZW4uCisgKi8KK3B1YmxpYyBzdHJpbmcgaG9zdCggbWl4ZWQgaXBudW0gKSB7CisJc3RyaW5nIGhvc3QsY2l0eTsKKwlpbnQgZXhwaXJlLHN0YXRlOworCisJaWYoIG9iamVjdHAoaXBudW0pICkgeworCQlpcG51bSA9IHF1ZXJ5X2lwX251bWJlcihpcG51bSk7CisJfQorCWlmKCAhc3RyaW5ncChpcG51bSkgKSB7CisJCXJldHVybiAiPHVuZGVmaW5lZD4iOworCX0KKwlpZiggIW1fY29udGFpbnMoICZob3N0LCAmY2l0eSwgJmV4cGlyZSwgJnN0YXRlLCBpcG1hcCwgaXBudW0gKSApIHsKKwkJbWFrZV9yZXF1ZXN0KCBpcG51bSApOworCQlyZXR1cm4gaXBudW07CisJfQorCisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qIHdpcmQgdm9tIG1hc3RlciBhdWZnZXJ1ZmVuLCB3ZW5uIGVpbmUgYW50d29ydCB2b20gZXh0ZXJuZW4KKyAqIGlwbG9va3VwIGRpZW5zdCBlaW50cnVkZWx0LgorICovCitwdWJsaWMgdm9pZCB1cGRhdGUoIHN0cmluZyB1ZHBfcmVwbHkgKSB7CisJc3RyaW5nKiByZXBseTsKKwlpZiggcHJldmlvdXNfb2JqZWN0KCkhPW1hc3RlcigpICkgcmV0dXJuOworCXJlcGx5ID0gZXhwbG9kZSh1ZHBfcmVwbHksIlxuIik7CisJaWYoIHNpemVvZihyZXBseSk8NCApIHJldHVybjsKKworCWlmKCByZXBseVszXSA9PSAiPHVua25vd24+IiApIHJlcGx5WzNdID0gcmVwbHlbMV07CisJaWYoIHJlcGx5WzJdID09ICI8dW5rbm93bj4iICkgcmVwbHlbMl0gPSAiaXJnZW5kd29oZXIiOworCWlwbWFwICs9IChbIHJlcGx5WzFdIDogcmVwbHlbM10gOyByZXBseVsyXSA7IHRpbWUoKStDQUNIRV9USU1FIDsKKwkJU1RBVFVTX0FVVEhPUklUQVRJVkUgXSk7CisJLy9zYXZlX29iamVjdCggSVBMT09LVVBfU0FWRSApOworfQorCitpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc2F2ZV9vYmplY3QoIElQTE9PS1VQX1NBVkUgKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCisvLyBERUJVR0dJTkcgQ09ERQorCisjaWYgMAorcHVibGljIHZvaWQgZHVtcCggc3RyaW5nIGtleSwgbWl4ZWQqIGRhdGEgKSB7CisJcHJpbnRmKCAiJXM6ICVzICglcykgcz0lZCBiaXMgJWRcbiIsIGtleSwgZGF0YVswXSwgZGF0YVsxXSwKKwkJZGF0YVszXSwgZGF0YVsyXSApOworfQorCitwdWJsaWMgdm9pZCBsb2FkKHN0cmluZyBzKSB7CisJcmVzdG9yZV9vYmplY3Qocyk7CisJaWYoICFtYXBwaW5ncChpcG1hcCkgfHwgd2lkdGhvZihpcG1hcCkhPTQgKSB7CisJCWlwbWFwID0gbV9hbGxvY2F0ZSggMCwgNCApOworCQlMT0coInJlc3RvcmUgZmFpbGVkLCBjcmVhdGluZyBuZXcgaXBtYXAiKTsKKwl9IGVsc2UgeworCSAgTE9HKHNwcmludGYoImNyZWF0ZWQgKCVkIGVudHJpZXMpIixzaXplb2YoaXBtYXApKSk7CisJfQorfQorCitwdWJsaWMgdm9pZCBkZWJ1ZygpIHsKKwltYXAoIGlwbWFwLCAjJ2R1bXAgKTsKKwlwcmludGYoICI9ICVkIEVpbnRyYWVnZVxuIiwgc2l6ZW9mKGlwbWFwKSApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9wL2RhZW1vbi9sYWctby1kYWVtb24uYyBiL3AvZGFlbW9uL2xhZy1vLWRhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjM4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9sYWctby1kYWVtb24uYwpAQCAtMCwwICsxLDI3MiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpICAgICAgICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksIkxBRzogIit4KyJcbiIpCisjZW5kaWYKKworI2RlZmluZSBTQVZFRklMRSBfX0RJUl9fKyJzYXZlL2xhZy1vLWRhZW1vbiIKKyNkZWZpbmUgTE9HKHgpIGxvZ19maWxlKCJMQUciLHgsMjAwMDAwKTsKKyNkZWZpbmUgTE9HTUFYKHgpIGxvZ19maWxlKCJMQUdNQVgiLHgsMzAwMDAwKTsKKworLy8gQW56YWhsIGFuIHp1IG1lcmtlbmRlbiBXZXJ0ZW4gKDE4MDA9PTM2MDBzKQorI2RlZmluZSBNRVNTV0VSVEUgMTgwMAorCitub3NhdmUgZmxvYXQgaGJzdGF0LCBvYnN0YXQ7Citub3NhdmUgbWFwcGluZyBsYXN0d2FybmluZz0oW10pOworbm9zYXZlIGludCAqbGFzdHRpbWUgPSB1dGltZSgpOworbm9zYXZlIGludCBsYXN0aGJjb3VudCA9IGFic29sdXRlX2hiX2NvdW50KCk7CitmbG9hdCAqbGFnZGF0YSA9IGFsbG9jYXRlKE1FU1NXRVJURSwwLjApOworLy8gTGFncyBmdWVyIGRpZSBsZXR6dGVuICAgMnMgKDEgSEIpLCAyMHMgKDEwIEhCKSwgNjBzICgzMCBIQiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgMzAwcyAoMTUwIEhCKSwgOTAwcyAoNDUwIEhCKSwgMzYwMHMgKDE4MDAgSEIpCitmbG9hdCAqbGFnID0gYWxsb2NhdGUoNiwwLjApOworaW50ICpoYmRhdGEgPSBhbGxvY2F0ZShNRVNTV0VSVEUpOworLy8gTGFncyBmdWVyIGRpZSBsZXR6dGVuICAgMnMgKDEgSEIpLCAyMHMgKDEwIEhCKSwgNjBzICgzMCBIQiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgMzAwcyAoMTUwIEhCKSwgOTAwcyAoNDUwIEhCKSwgMzYwMHMgKDE4MDAgSEIpCitpbnQgKmhicyA9IGFsbG9jYXRlKDYpOworaW50ICpjb2RhdGEgPSBhbGxvY2F0ZShNRVNTV0VSVEUpOworLy8gTGFncyBmdWVyIGRpZSBsZXR6dGVuICAgMnMgKDEgSEIpLCAyMHMgKDEwIEhCKSwgNjBzICgzMCBIQiksCisvLyAgICAgICAgICAgICAgICAgICAgICAgMzAwcyAoMTUwIEhCKSwgOTAwcyAoNDUwIEhCKSwgMzYwMHMgKDE4MDAgSEIpCitpbnQgKmNhbGxvdXRzID0gYWxsb2NhdGUoNik7CisKK3ZvaWQgY3JlYXRlKCkgeworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgLy8gQmVpIG5pY2h0IGVpbmxlc2JhcmVuIFNhdmVmaWxlIHVuZCBuYWNoIFJlYm9vdCBXZXJ0ZSBuZXUgaW5pdGlhbGlzaWVyZW4uCisgIC8vIERlbm4gZGFubiBpc3QgZGllIERpZmZlcmVueiBkZXIgSEJzIGJlZGV1dHVuZ3Nsb3MuIEVya2VubnVuZyBwbG9ldHpsaWNoCisgIC8vIGtsZWluZXJlIEhCLVphaGwuCisgIGlmICghcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpCisgICAgICB8fCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUykgPCBsYXN0aGJjb3VudCkKKyAgeworICAgIGxhZ2RhdGEgPSBhbGxvY2F0ZShNRVNTV0VSVEUsMC4wKTsKKyAgICBsYWcgPSBhbGxvY2F0ZSg2LDAuMCk7CisgICAgaGJkYXRhID0gYWxsb2NhdGUoTUVTU1dFUlRFKTsKKyAgICBoYnMgPSBhbGxvY2F0ZSg2KTsKKyAgICBjb2RhdGEgPSBhbGxvY2F0ZShNRVNTV0VSVEUpOworICAgIGNhbGxvdXRzID0gYWxsb2NhdGUoNik7CisgIH0KKyAgc2V0X2hlYXJ0X2JlYXQoMSk7Cit9CisKK2ludCByZW1vdmUoaW50IHNpbGVudCkgeworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKworLy8gbGllZmVydCBNaXR0ZWx3ZXJ0YXJyYXkgenVydWVjaworLy9UT0RPOiA8aW50fHN0cmluZz4qIHJlc3VsdHMgCitwcml2YXRlIG1peGVkIGNhbGNfYXZlcmFnZXMobWl4ZWQgZGF0YSwgbWl4ZWQgcmVzdWx0cywgaW50IGluZGV4LCBmbG9hdCBzY2FsZSkgeyAKKyAgZmxvYXQgdG1wOworICBpbnQgdDsKKworICBpZiAoIXNjYWxlKSBzY2FsZT0xLjA7CisgIAorICAvLyAycworICByZXN1bHRzWzBdID0gdG9fZmxvYXQoZGF0YVtpbmRleF0pICogc2NhbGU7CisKKyAgLy8gYWxsZSAxMHMgLyA1IEhCcyBkZW4gMjBzLVdlcnQgbmV1IGJlcmVjaG5lbgorICBpZiAoIGluZGV4JTUgPT0gMSkgeworICAgIGlmIChpbmRleDw5KSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC00K01FU1NXRVJURSAuLiBNRVNTV0VSVEUtMSkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2goaW50IGk6IDAgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgZm9yZWFjaChpbnQgaTogaW5kZXgtOSAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0c1sxXT10bXAvdG9fZmxvYXQodCkgKiBzY2FsZTsKKyAgfQorCisgIC8vIGFsbGUgMTBzIC8gNSBIQnMgZGVuIDYwcy1XZXJ0IG5ldSBiZXJlY2huZW4sIGFiZXIgaW4gYW5kZXJlbSBIQiBhbHMgZGVuCisgIC8vIDEwcy1XZXJ0CisgIGlmICggaW5kZXglNSA9PSAzKSB7CisgICAgdG1wPTAuMDsKKyAgICB0PTA7CisgICAgaWYgKGluZGV4PDI5KSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC0xNCtNRVNTV0VSVEUgLi4gTUVTU1dFUlRFLTEpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgICBmb3JlYWNoKGludCBpOiAwIC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvcmVhY2goaW50IGk6IGluZGV4LTI5IC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICByZXN1bHRzWzJdPXRtcC90b19mbG9hdCh0KSAqIHNjYWxlOworICB9CisKKyAgLy8gMzAwcworICAvLyBhbGxlIDQwcyAvIDIwIEhCcyBkZW4gMzAwcy1XZXJ0IG5ldSBiZXJlY2huZW4uCisgIGlmICggaW5kZXglMjAgPT0gMTIpIHsKKyAgICB0bXA9MC4wOworICAgIHQ9MDsKKyAgICBpZiAoaW5kZXg8MTQ5KSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC03NCtNRVNTV0VSVEUgLi4gTUVTU1dFUlRFLTEpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgICBmb3JlYWNoKGludCBpOiAwIC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvcmVhY2goaW50IGk6IGluZGV4LTE0OSAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0c1szXT10bXAvdG9fZmxvYXQodCkgKiBzY2FsZTsKKyAgfQorCisKKyAgLy8gOTAwcworICAvLyBhbGxlIDgwcyAvIDQwIEhCcyBkZW4gOTAwcy1XZXJ0IG5ldSBiZXJlY2huZW4uCisgIGlmICggaW5kZXglNDAgPT0gMzEpIHsKKyAgICB0bXA9MC4wOworICAgIHQ9MDsKKyAgICBpZiAoaW5kZXg8NDQ5KSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC0yMjQrTUVTU1dFUlRFIC4uIE1FU1NXRVJURS0xKSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgICAgZm9yZWFjaChpbnQgaTogMCAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC00NDkgLi4gaW5kZXgpIHsKKyAgICAgICAgdG1wKz1kYXRhW2ldOworICAgICAgICB0Kys7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdHNbNF09dG1wL3RvX2Zsb2F0KHQpICogc2NhbGU7CisgIH0KKworICAvLyAzNjAwcworICAvLyBhbGxlIDMwMHMgLyAxNTAgSEJzIGRlbiAzNjAwcy1XZXJ0IG5ldSBiZXJlY2huZW4uCisgIGlmICggaW5kZXglMTUwID09IDEyOCkgeworICAgIHRtcD0wLjA7CisgICAgdD0wOworICAgIGlmIChpbmRleDwxNzk5KSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC04OTkrTUVTU1dFUlRFIC4uIE1FU1NXRVJURS0xKSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgICAgZm9yZWFjaChpbnQgaTogMCAuLiBpbmRleCkgeworICAgICAgICB0bXArPWRhdGFbaV07CisgICAgICAgIHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmb3JlYWNoKGludCBpOiBpbmRleC0xNzk5IC4uIGluZGV4KSB7CisgICAgICAgIHRtcCs9ZGF0YVtpXTsKKyAgICAgICAgdCsrOworICAgICAgfQorICAgIH0KKyAgICByZXN1bHRzWzVdPXRtcC90b19mbG9hdCh0KSAqIHNjYWxlOworICB9CisgIHJldHVybiByZXN1bHRzOworfQorCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkgeworICBpbnQgaGJjb3VudD1lZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgIC8vIHBlciBNb2R1bG8gSW5kZXggYXVmIDAgLSA0NDkgYmVncmVuemVuCisgIGludCBpbmRleD1oYmNvdW50JU1FU1NXRVJURTsKKworICAvLyBtYXNzIGZ1ZXIgZGFzIGxhZyBpc3QgZGFzIFZlcmhhZWx0bmlzIHZvbiB2ZXJnYW5nZW5lciBTb2xsemVpdCAoRGlmZmVyZW56CisgIC8vIEhCLUNvdW50cyAqIDIpIHVuZCB2ZXJnYW5nZW5lciBJc3R6ZWl0IChEaWZmZXJlbnogdm9uIHRpbWUoKSkuIFVuZCBkYXMKKyAgLy8gZ2FuemUgd2lyZCBkYW5uIGFscyBBYndlaWNodW5nIHZvbiAxIGdlc3BlaWNoZXJ0ICgwLCB3ZW5uIGtlaW4gTGFnKQorICBpbnQgKm5vd3RpbWUgPSB1dGltZSgpOworICBmbG9hdCB0aW1lZGlmZiA9IHRvX2Zsb2F0KChub3d0aW1lWzBdLWxhc3R0aW1lWzBdKSkgCisgICAgICAgICAgICAgICAgICsgdG9fZmxvYXQobm93dGltZVsxXS1sYXN0dGltZVsxXSkvMTAwMDAwMC4wOworCisvLyAgbGFnZGF0YVtpbmRleF0gPSAxLjAgLQorLy8gICAgICAgICAgICAgICAgICAgKHRvX2Zsb2F0KChoYmNvdW50IC0gbGFzdGhiY291bnQpICogX19IRUFSVF9CRUFUX0lOVEVSVkFMX18pCisvLyAgICAgICAgICAgICAgICAgICAgIC8gdGltZWRpZmYpOworLy8gIGxhZ2RhdGFbaW5kZXhdID0gKHRpbWVkaWZmIC0KKy8vICAgIHRvX2Zsb2F0KChoYmNvdW50IC0gbGFzdGhiY291bnQpICogX19IRUFSVF9CRUFUX0lOVEVSVkFMX18pKSAvCisvLyAgICB0b19mbG9hdCgoaGJjb3VudCAtIGxhc3RoYmNvdW50KSAqIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fKTsKKyAgbGFnZGF0YVtpbmRleF0gPSBhYnModG9fZmxvYXQoKGhiY291bnQgLSBsYXN0aGJjb3VudCkgKiBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXykKKyAgICAgICAgICAgICAgICAgICAgLSB0aW1lZGlmZikgIC8KKyAgICAgICAgICAgICAgICAgICB0b19mbG9hdCgoaGJjb3VudCAtIGxhc3RoYmNvdW50KSAqIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fKTsKKworCisgIGhiZGF0YVtpbmRleF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7CisgIGNvZGF0YVtpbmRleF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworCisgIC8qICAgICAgICAgICAgICAgICAgICAgCisgIERFQlVHKHNwcmludGYoIkluZGV4OiAlZDogJWQvJS42ZiA9PiAlOjZmIC8xXG4iLGluZGV4LAorICAgICAgICAoaGJjb3VudCAtIGxhc3RoYmNvdW50KSoyLAorICAgICAgICB0aW1lZGlmZiwgbGFnZGF0YVtpbmRleF0pKTsKKyAgKi8gICAgICAKKyAgbGFzdGhiY291bnQ9aGJjb3VudDsKKyAgbGFzdHRpbWU9bm93dGltZTsKKyAKKyAgbGFnID0gY2FsY19hdmVyYWdlcyhsYWdkYXRhLCBsYWcsIGluZGV4LCAxMDAuMCk7CisgIC8vIE11bHRpcGxpemllcmVuIG1pdCAxMDAKKyAgLy9ERUJVRyhzcHJpbnRmKCIlT1xuIixsYWcpKTsKKyAgLy9sYWcgPSBtYXAobGFnLCBmdW5jdGlvbiBmbG9hdCAoZmxvYXQgZikge3JldHVybiBmKjEwMC4wO30gKTsKKyAgLy9ERUJVRyhzcHJpbnRmKCIlT1xuIixsYWcpKTsKKyAgaGJzID0gbWFwKGNhbGNfYXZlcmFnZXMoaGJkYXRhLCBoYnMsIGluZGV4LDEuMCksIyd0b19pbnQpOworICBjYWxsb3V0cyA9IG1hcChjYWxjX2F2ZXJhZ2VzKGNvZGF0YSwgY2FsbG91dHMsIGluZGV4LDEuMCksIyd0b19pbnQpOworCisgIC8vIHVuZCBhdXNzZXJkZW0gbWFsIGV0d2FzIGxvZ2dlbiBmdWVyIGRlbiBNb21lbnQKKyAgaWYgKGxhZ1swXSA+IDEwMDAgfHwgY2FsbG91dHNbMF0gPiAxMDAwKQorICB7CisgIExPR01BWChzcHJpbnRmKCIlcywgJWQsICVkLCAlOjZmLCAlOjZmLCAlOjZmLCAlOjZmLCAlOjZmLCAlOjZmLCAiCisgICAgICAgICAgICAgICIlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAiCisgICAgICAgICAgICAgICIlZCwgJWQsICVkLCAlZCwgJWQsICVkLCBcbiIsCisgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSx0aW1lKCksaGJjb3VudCwKKyAgICAgICAgICBsYWdbMF0sbGFnWzFdLGxhZ1syXSxsYWdbM10sbGFnWzRdLGxhZ1s1XSwKKyAgICAgICAgICBoYnNbMF0saGJzWzFdLGhic1syXSxoYnNbM10saGJzWzRdLGhic1s1XSwKKyAgICAgICAgICBjYWxsb3V0c1swXSxjYWxsb3V0c1sxXSxjYWxsb3V0c1syXSxjYWxsb3V0c1szXSxjYWxsb3V0c1s0XSwKKyAgICAgICAgICBjYWxsb3V0c1s1XSkpOworICB9CisgIGVsc2UgaWYgKGhiY291bnQlODAgPT0gMCB8fCBsYWdbMF0gPiAxMCkKKyAgeworICBMT0coc3ByaW50ZigiJXMsICVkLCAlZCwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgJTo2ZiwgIgorICAgICAgICAgICAgICAiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgIgorICAgICAgICAgICAgICAiJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgXG4iLAorICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksdGltZSgpLGhiY291bnQsCisgICAgICAgICAgbGFnWzBdLGxhZ1sxXSxsYWdbMl0sbGFnWzNdLGxhZ1s0XSxsYWdbNV0sCisgICAgICAgICAgaGJzWzBdLGhic1sxXSxoYnNbMl0saGJzWzNdLGhic1s0XSxoYnNbNV0sCisgICAgICAgICAgY2FsbG91dHNbMF0sY2FsbG91dHNbMV0sY2FsbG91dHNbMl0sY2FsbG91dHNbM10sY2FsbG91dHNbNF0sCisgICAgICAgICAgY2FsbG91dHNbNV0pKTsKKyAgfQorfQorCitmbG9hdCAqcmVhZF9sYWdfZGF0YSgpIHsKKyAgcmV0dXJuICh7bGFnWzJdLGxhZ1s0XSxsYWdbNV19KTsKK30KK2Zsb2F0ICpyZWFkX2V4dF9sYWdfZGF0YSgpIHsKKyAgcmV0dXJuIGNvcHkobGFnKTsKK30KK2ludCAqcmVhZF9oYl9kYXRhKCkgeworICByZXR1cm4gY29weShoYnMpOworfQoraW50ICpyZWFkX2NvX2RhdGEoKSB7CisgIHJldHVybiBjb3B5KGNhbGxvdXRzKTsKK30KKwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vbWFuZC5jIGIvcC9kYWVtb24vbWFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGM1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9tYW5kLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8vCisvLyBtYW5kLmMgLSBNYW5wYWdlIERhZW1vbgorLy8KKy8vIEVyd2VpdGVydCB1bmQgdW1nZWFyYmVpdGV0IGZ1ZXIgZGllIEFuYmluZHVuZyBkdXJjaAorLy8gZGllIE1hZ2llcnNoZWxsCisvLworLy8gdm9uIE1hbmRyYWdvbkBNRworLy8KKy8vIEJhc2llcnQgYXVmIGRlciBBcmJlaXQgdm9uIEhhZHJhLE11cGZlbCB1bmQgVHlyb24KKy8vIChhbGxlIEBBbmRlcmxhbmQpCisvLworCisjZGVmaW5lIERFQlVHR0VSICJtYW5kcmFnb24iCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKERFQlVHR0VSKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKERFQlVHR0VSKSx4KyJcbiIpCisKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPGRhZW1vbi9tYW5kLmg+CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgcGFnZXM7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmtleXM7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHBhZ2VzX2Nhc2U7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmtleXNfY2FzZTsKKworc3RhdGljIHN0cmluZyBnbG9iMnJlZ2V4cChzdHJpbmcgc3RyKQoreworICBzdHI9cmVncmVwbGFjZShzdHIsIihbXFwuXFxeXFwkXFxbXFxdXFwoXFwpXSkiLCJcXFxcXFwxIiwxKTsKKyAgc3RyPXJlZ3JlcGxhY2Uoc3RyLCJcXCoiLCIuKiIsMSk7CisgIHJldHVybiByZWdyZXBsYWNlKCJeIitzdHIrIiQiLCI/IiwiLiIsMSk7Cit9CisKK3ZvaWQgY2FjaGVfZW50cnkoc3RyaW5nIGVudHJ5LCBzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSkKK3sKKyAgc3RyaW5nICpkYXRhOworICBpbnQgajsKKworICBpZiAobV9jb250YWlucygmZGF0YSxwYWdlcyxsb3dlcl9jYXNlKGVudHJ5KSkpCisgIHsKKyAgICBqPXNpemVvZihkYXRhKTsKKyAgICB3aGlsZShqLS0pIGRhdGFbLS1qXT1kYXRhW2pdOworICAgIHBhZ2VzW2xvd2VyX2Nhc2UoZW50cnkpXT1kYXRhKyh7IGRpcisiLyIrZmlsZSwgZGlyKyIvIitmaWxlfSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcGFnZXNbbG93ZXJfY2FzZShlbnRyeSldPSh7ZW50cnksZGlyKyIvIitmaWxlfSk7CisgICAga2V5cys9KHtsb3dlcl9jYXNlKGVudHJ5KX0pOworICB9CisgIGlmIChtX2NvbnRhaW5zKCZkYXRhLHBhZ2VzX2Nhc2UsZW50cnkpKQorICB7CisgICAgaj1zaXplb2YoZGF0YSk7CisgICAgd2hpbGUoai0tKSBkYXRhWy0tal09ZGF0YVtqXTsKKyAgICBwYWdlc19jYXNlW2VudHJ5XT1kYXRhKyh7IGRpcisiLyIrZmlsZSwgZGlyKyIvIitmaWxlfSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgcGFnZXNfY2FzZVtlbnRyeV09KHtlbnRyeSxkaXIrIi8iK2ZpbGV9KTsKKyAgICBrZXlzX2Nhc2UrPSh7ZW50cnl9KTsKKyAgfQorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfc3lub255bXMoc3RyaW5nIGRpcikKK3sKKyAgc3RyaW5nIGZpbGVkYXRhLCpzeW47CisKKyAgaWYgKGZpbGVfc2l6ZShNQU5EX0RPQ0RJUitkaXIrIi8uc3lub255bSIpPD0wKSByZXR1cm47CisgIGlmICghKGZpbGVkYXRhPXJlYWRfZmlsZShNQU5EX0RPQ0RJUitkaXIrIi8uc3lub255bSIpKSkgcmV0dXJuOworICBzeW49cmVnZXhwbG9kZShmaWxlZGF0YSwgIihbIFx0XVsgXHRdKnxcbikiKS0oeyIifSk7CisgIHN5bi09cmVnZXhwKHN5biwiXihbIFx0XVsgXHRdKnxcbikkIik7CisgIHdoaWxlKHNpemVvZihzeW4pKQorICB7CisgICAgY2FjaGVfZW50cnkoc3luWzBdLGRpcixzeW5bMV0pOworICAgIHN5bj1zeW5bMi4uXTsKKyAgfQorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2RpcmVjdG9yeShzdHJpbmcgZGlyKQoreworICBzdHJpbmcgZmlsZTsKKyAgaW50IGksajsKKyAgbWl4ZWQgKmZpbGVzOworCisgIGZpbGVzID0gZ2V0X2RpcihNQU5EX0RPQ0RJUitkaXIrIi8qIiwzKXx8KHt9KTsKKyAgaT1zaXplb2YoZmlsZXMpOworICBmb3IgKGo9MDtqPGk7KQorICB7CisgICAgZmlsZT1maWxlc1tqKytdOworICAgIGlmIChmaWxlWzBdPT0nLicpCisgICAgeworICAgICAgaisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChmaWxlc1tqKytdPT0tMikKKyAgICB7CisgICAgICBjYWNoZV9kaXJlY3RvcnkoZGlyKyIvIitmaWxlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjYWNoZV9lbnRyeShmaWxlLGRpcixmaWxlKTsKKyAgfQorICBsb2FkX3N5bm9ueW1zKGRpcik7Cit9CisKK3ZvaWQgdXBkYXRlX2NhY2hlKCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqZG9jZGlyczsKKyAgbWl4ZWQgKnRtcDsKKworICB0bXA9Z2V0X2RpcihNQU5EX0RPQ0RJUiAiKiIsMyk7CisgIGRvY2RpcnM9KHt9KTsKKyAgcGFnZXM9KFtdKTsKKyAgcGFnZXNfY2FzZT0oW10pOworICBrZXlzX2Nhc2U9KHt9KTsKKyAga2V5cz0oe30pOworICBpPXNpemVvZih0bXApOworICB3aGlsZShpLS0pCisgICAgaWYgKHRtcFtpXT09LTIpCisgICAgICBkb2NkaXJzKz0oeyB0bXBbKGktLSktMV0gfSk7CisgIGRvY2RpcnMtPSh7Ii4iLCIuLiJ9KTsKKyAgZG9jZGlycy09TUFORF9FWENMVURFOworICBpPXNpemVvZihkb2NkaXJzKTsKKyAgd2hpbGUoaS0tKSBjYWNoZV9kaXJlY3RvcnkoZG9jZGlyc1tpXSk7CisgIHJldHVybjsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgdXBkYXRlX2NhY2hlKCk7CisgIHNldF9uZXh0X3Jlc2V0KDEwMDgwKTsgLy9FaW5tYWwgcHJvIFdvY2hlIGxhbmd0CisgIHJldHVybjsKK30KKwordm9pZCByZXNldCgpCit7CisgIHVwZGF0ZV9jYWNoZSgpOworICBzZXRfbmV4dF9yZXNldCgxMDA4MCk7CisgIHJldHVybjsKK30KKworLy8KKy8vIGxvY2F0ZSgpOiBNYW5wYWdlIGltIENhY2hlIHN1Y2hlbjoKKy8vIG1hdGNoID0gMSAtPiBnbG9iLW1hdGNoaW5nLCBtYXRjaD0yIC0+IHJlZ2V4cC1tYXRjaGluZworLy8gUHJ1ZWZ1bmcgb2Igc3RyIGd1ZWx0aWdlIHJlZ2V4cCBlcmZvbGd0IGluIGRlciBTaGVsbAorLy8KKworc3RyaW5nICpsb2NhdGUoc3RyaW5nIHN0cixpbnQgbWF0Y2gpCit7CisgIHN0cmluZyAqbWF0Y2hlcywqcmV0LHN0cjI7CisgIGludCBpOworCisgIGlmICghbWF0Y2gmJm1lbWJlcihrZXlzX2Nhc2Usc3RyKSE9LTEpIHJldHVybiBwYWdlc19jYXNlW3N0cl07CisgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGlmIChtYXRjaD09MSkgc3RyPWdsb2IycmVnZXhwKHN0cik7CisgIGlmIChtYXRjaCkgbWF0Y2hlcz1yZWdleHAoa2V5cyxzdHIpOworICBlbHNlIGlmIChtZW1iZXIoa2V5cyxzdHIpIT0tMSkgbWF0Y2hlcz0oeyBzdHIgfSk7CisgIGVsc2UgcmV0dXJuICh7fSk7CisKKyAgcmV0PSh7fSk7CisgIGk9c2l6ZW9mKG1hdGNoZXMpOworICB3aGlsZShpLS0pCisgICAgcmV0Kz1wYWdlc1ttYXRjaGVzW2ldXTsKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL21vbmV5bG9nLmMgYi9wL2RhZW1vbi9tb25leWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTU5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9tb25leWxvZy5jCkBAIC0wLDAgKzEsMjQ2IEBACisvLyBMb2ctRGFlbW9uLCB1bSBHZWxkYnVncyB6dSBmaW5kZW4uCisvLworLy8gTm9jaCBleHBlcmltZW50ZWxsLCBpY2ggZmVpbGUgbm9jaCBmbGVpc3NpZyBhbiBkZW4gV2VydGVuJkNvLgorLy8gV2VyIG1pciBvaG5lIHRyaWZ0aWdlbiBHcnVuZCBkYXJhbiBoZXJ1bXBmdXNjaHQsIGRlciB3aXJkIHN0YW5kZXNyZWNodGxpY2gKKy8vIG1pdCBmYXVsZW4gRWllcm4gYmV3b3JmZW4uIF06LT4KKy8vCisvLyBUaWFtYWsKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3cKKworI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKyNkZWZpbmUgTE9HTkFNRSAiQURETU9ORVkiCisjZGVmaW5lIFNBVkVGSUxFICIvcC9kYWVtb24vc2F2ZS9tb25leWxvZyIKKworI2RlZmluZSBUSFJFU0hPTERfSE9VUkxZIDEwMDAwIC8vIHdpZXZpZWwgR2VsZCBkYXJmIG1hbiBhbiBlaW5lciBTdGVsbGUgcHJvCisjZGVmaW5lIFRIUkVTSE9MRF9EQUlMWSAgNTAwMDAgLy8gU3R1bmRlL1RhZyBiZWtvbW1lbiwgb2huZSBkYXNzIGdlbG9nZ3Qgd2lyZD8KKworCitwcml2YXRlIG1hcHBpbmcgbW9uLCBncmVuemVuOworcHJpdmF0ZSBpbnQgY2hlY2ssIG5leHRfcmVzZXQ7CisKKworcHVibGljIHZvaWQgY3JlYXRlKCkKK3sgICAgCisgICAgLy8gd2lyIG11ZXNzZW4gU2F2ZWZpbGUgc2NocmVpYmVuIGR1ZXJmZW4KKyAgICBzZXRldWlkKGdldHVpZCgpKTsKKyAgICAKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKXsKKyAgICAgICAgbW9uID0gbV9hbGxvY2F0ZSggMCwgMiApOworICAgICAgICBncmVuemVuID0gbV9hbGxvY2F0ZSggMCwgMiApOworICAgICAgICBjaGVjayA9IDA7CisgICAgICAgIG5leHRfcmVzZXQgPSAzNjAwOworICAgIH0KKworICAgIGlmICggbmV4dF9yZXNldCA+IDM2MDAgKQorICAgICAgICBuZXh0X3Jlc2V0ID0gMzYwMDsKKworICAgIGlmICggbmV4dF9yZXNldCA8IDYwICkKKyAgICAgICAgbmV4dF9yZXNldCA9IDYwOworCisgICAgLy8gQXVzd2VydHVuZyBqZWRlIFN0dW5kZQorICAgIHNldF9uZXh0X3Jlc2V0KCBuZXh0X3Jlc2V0ICk7CisgICAgbmV4dF9yZXNldCArPSB0aW1lKCk7Cit9CisKKworLy8gU29ydGllcmZ1bmt0aW9uZW4KKworc3RhdGljIGludCBfc29ydF9ob3VybHkoIHN0cmluZyBmbjEsIHN0cmluZyBmbjIgKQoreworICAgIHJldHVybiBtb25bZm4xLCAwXSA+IG1vbltmbjIsIDBdOworfQorCisKK3N0YXRpYyBpbnQgX3NvcnRfZGFpbHkoIHN0cmluZyBmbjEsIHN0cmluZyBmbjIgKQoreworICAgIHJldHVybiBtb25bZm4xLCAxXSA+IG1vbltmbjIsIDFdOworfQorCisKKy8vIGltIHJlc2V0KCkgd2lyZCBkaWUgQXVzd2VydHVuZyB2b3JnZW5vbW1lbgorcHVibGljIHZvaWQgcmVzZXQoKQoreworICAgIGludCBpOworICAgIHN0cmluZyAqZmlsZXMsIHR4dDsKKworICAgIC8vIGtlaW5lbiBBdWZydWYgcGVyIEhhbmQgYml0dGUKKyAgICBpZiAoIHRpbWUoKSA8IG5leHRfcmVzZXQgKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBdXN3ZXJ0dW5nIGplZGUgU3R1bmRlCisgICAgc2V0X25leHRfcmVzZXQoMzYwMCk7CisgICAgbmV4dF9yZXNldCA9IHRpbWUoKSArIDM2MDA7CisgICAgY2hlY2srKzsKKyAgICB0eHQgPSAiIjsKKyAgICAKKyAgICBmaWxlcyA9IHNvcnRfYXJyYXkoIG1faW5kaWNlcyhtb24pLCAjJ19zb3J0X2hvdXJseS8qJyovICk7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGZpbGVzKTsgaS0tOyApeworICAgICAgICBpZiAoICEoZ3JlbnplbltmaWxlc1tpXSwgMF0gPCAwKSAmJgorICAgICAgICAgICAgIChncmVuemVuW2ZpbGVzW2ldLCAwXSAmJiBtb25bZmlsZXNbaV0sIDBdID4gZ3JlbnplbltmaWxlc1tpXSwgMF0pCisgICAgICAgICAgICAgfHwgKCFncmVuemVuW2ZpbGVzW2ldLCAwXSAmJiBtb25bZmlsZXNbaV0sIDBdID4gVEhSRVNIT0xEX0hPVVJMWSkgKQorICAgICAgICAgICAgdHh0ICs9IHNwcmludGYoICIlMTJkIC0tLSAlc1xuIiwgbW9uW2ZpbGVzW2ldLCAwXSwgZmlsZXNbaV0gKTsKKyAgICAKKyAgICAgICAgbW9uW2ZpbGVzW2ldLCAwXSA9IDA7CisgICAgfQorCisgICAgLy8gbnVyIGxvZ2dlbiwgd2VubiBlcyBhdWNoIGV0d2FzIHp1IGxvZ2dlbiBnaWJ0CisgICAgaWYgKCB0eHQgIT0gIiIgKQorICAgICAgICBsb2dfZmlsZSggTE9HTkFNRSwgc3ByaW50ZiggIiVzOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09KHN0dWVuZGxpY2gpPT09XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li4xNV0gKSArIHR4dCApOworCisgICAgLy8gZGVyICJncm9zc2UiIENoZWNrIGtvbW10IG51ciBlaW5tYWwgcHJvIFRhZworICAgIGlmICggY2hlY2sgPCAyNCApeworICAgICAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGVjayA9IDA7CisgICAgdHh0ID0gIiI7CisgICAgZmlsZXMgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobW9uKSwgIydfc29ydF9kYWlseS8qJyovICk7CisgICAgCisgICAgZm9yICggaSA9IHNpemVvZihmaWxlcyk7IGktLTsgKQorICAgICAgICBpZiAoICEoZ3JlbnplbltmaWxlc1tpXSwgMV0gPCAwKSAmJgorICAgICAgICAgICAgIChncmVuemVuW2ZpbGVzW2ldLCAxXSAmJiBtb25bZmlsZXNbaV0sIDFdID4gZ3JlbnplbltmaWxlc1tpXSwgMV0pCisgICAgICAgICAgICAgfHwgKCFncmVuemVuW2ZpbGVzW2ldLCAxXSAmJiBtb25bZmlsZXNbaV0sIDFdID4gVEhSRVNIT0xEX0RBSUxZKSApCisgICAgICAgICAgICB0eHQgKz0gc3ByaW50ZiggIiUxMmQgLS0tICVzXG4iLCBtb25bZmlsZXNbaV0sIDFdLCBmaWxlc1tpXSApOworCisgICAgaWYgKCB0eHQgIT0gIiIgKQorICAgICAgICBsb2dfZmlsZSggTE9HTkFNRSwgc3ByaW50ZiggIiVzOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09KHRhZWdsaWNoKT09PT09XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li4xNV0gKSArIHR4dCApOworCisgICAgbW9uID0gbV9hbGxvY2F0ZSggMSwgMiApOworICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKK30KKworCisvLyBkaWUgZWlnZW50bGljaGUgTG9nZy1GdW5rdGlvbgorcHVibGljIHZvaWQgQWRkTW9uZXkoIG9iamVjdCBvYiwgaW50IGFtb3VudCApCit7CisgICAgc3RyaW5nIGZuOworCisgICAgLy8ga2VpbmUgTWFuaXB1bGF0aW9uZW4gcGVyIEhhbmQgYml0dGUKKyAgICBpZiAoICFvYmplY3RwKG9iKSB8fCBhbW91bnQgPCAwIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgICAgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSAmJgorICAgICAgICAgIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gR0VMRCkKKyAgICAgICAgIHx8IElTX0xFQVJORVIocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm4gPSBleHBsb2RlKCBvYmplY3RfbmFtZShvYiksICIjIiApWzBdOworCisgICAgbW9uW2ZuLCAwXSArPSBhbW91bnQ7CisgICAgbW9uW2ZuLCAxXSArPSBhbW91bnQ7Cit9CisKKworLy8gU2F2ZWZpbGUgbm9jaCBzY2huZWxsIGFic3BlaWNoZXJuIC0gd2lyIHdvbGxlbiBqYSBrZWluZSBEYXRlbiB2ZXJsaWVyZW4gOy0pCitwdWJsaWMgaW50IHJlbW92ZSgpCit7CisgICAgbmV4dF9yZXNldCA9IHF1ZXJ5X25leHRfcmVzZXQodGhpc19vYmplY3QoKSkgLSB0aW1lKCk7CisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworCisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLy8gZnVlciBiZXN0aW1tdGUgRmlsZXMga2FubiBtYW4gZGllIEdyZW56d2VydGUgZWluemVsbiBzZXR6ZW4KK3B1YmxpYyB2YXJhcmdzIGludCBtb2RpZnlfdGhyZXNob2xkKCBzdHJpbmcgZm4sIGludCBhbW91bnQxLCBpbnQgYW1vdW50MiApCit7CisgICAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAhPSB0aGlzX3BsYXllcigpIHx8CisgICAgICAgICAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8IHByb2Nlc3NfY2FsbCgpICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCAhc3RyaW5ncChmbikgfHwgIWludHAoYW1vdW50MSkgfHwgIWludHAoYW1vdW50MikgKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpZiAoICFhbW91bnQxICYmICFhbW91bnQyICl7CisgICAgICAgIG1fZGVsZXRlKCBncmVuemVuLCBmbiApOworICAgICAgICB3cml0ZSggIkVpbnRyYWcgIiArIGZuICsgIiBnZWxvZXNjaHQuXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGdyZW56ZW5bZm4sIDBdID0gYW1vdW50MTsKKyAgICBncmVuemVuW2ZuLCAxXSA9IGFtb3VudDI7CisgICAgCisgICAgd3JpdGUoIGJyZWFrX3N0cmluZyggIkRpZSBHcmVuemVuIGZ1ZXIgIiArIGZuICsgIiBiZXRyYWdlbiBqZXR6dCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGFtb3VudDEgPCAwKSA/ICJ1bmVuZGxpY2ggdmllbGUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKGFtb3VudDEpKSArICIgTXVlbnplbiBmdWVyIGRlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0dWVuZGxpY2hlbiB1bmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgKChhbW91bnQyIDwgMCkgPyAidW5lbmRsaWNoIHZpZWxlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhhbW91bnQyKSkgKyAiIE11ZW56ZW4gZnVlciBkZW4gdGFlZ2xpY2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrLiIsIDc4ICkgKTsKKworICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBlaW56ZWxuIGdlc2V0enRlIEdyZW56d2VydGUgYWJmcmFnZW4KK3B1YmxpYyB2YXJhcmdzIG1peGVkIHF1ZXJ5X3RocmVzaG9sZHMoIHN0cmluZyBzdHIgKQoreworICAgIGludCBpOworICAgIHN0cmluZyAqZmlsZXMsIHR4dDsKKyAgICAKKyAgICBpZiAoICF0aGlzX3BsYXllcigpICkKKyAgICAgICAgcmV0dXJuIGRlZXBfY29weShncmVuemVuKTsKKworICAgIGlmICggc3RyaW5ncChzdHIpICYmIG1lbWJlciggZ3Jlbnplbiwgc3RyICkgKXsKKyAgICAgICAgd3JpdGUoIGJyZWFrX3N0cmluZyggIkRpZSBHcmVuemVuIGZ1ZXIgIiArIHN0ciArICIgYmV0cmFnZW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlbnplbltzdHIsIDBdIDwgMCkgPyAidW5lbmRsaWNoIHZpZWxlIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoZ3JlbnplbltzdHIsIDBdKSkgKyAiIE11ZW56ZW4gZnVlciBkZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3R1ZW5kbGljaGVuIHVuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVuemVuW3N0ciwgMV0gPCAwKSA/ICJ1bmVuZGxpY2ggdmllbGUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3N0cmluZyhncmVuemVuW3N0ciwgMV0pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTXVlbnplbiBmdWVyIGRlbiB0YWVnbGljaGVuIENoZWNrLiIsIDc4ICkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCBzdHJpbmdwKHN0cikgJiYgc3RyICE9ICIiICl7CisgICAgICAgIHdyaXRlKCAiRXMgc2luZCBrZWluZSBHcmVuemVuIGZ1ZXIgIiArIHN0ciArICIgZWluZ2V0cmFnZW4hXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZpbGVzID0gc29ydF9hcnJheSggbV9pbmRpY2VzKGdyZW56ZW4pLCAjJzwvKicqLyApOworICAgIHR4dCA9ICJFaW5nZXRyYWdlbmUgR3Jlbnp3ZXJ0ZTpcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKworICAgIGZvciAoIGkgPSBzaXplb2YoZmlsZXMpOyBpLS07ICkKKyAgICAgICAgdHh0ICs9IHNwcmludGYoICIlJy4nLTQ4cyA6ICU4ZCAoaCkgJTEwZCAoZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1tpXSwgZ3JlbnplbltmaWxlc1tpXSwgMF0sIGdyZW56ZW5bZmlsZXNbaV0sIDFdICk7CisKKyAgICB0aGlzX3BsYXllcigpLT5Nb3JlKCB0eHQgKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBiaXNoZXIgZ2Vsb2dndGUgRGF0ZW4gYWJmcmFnZW4KK3B1YmxpYyBtaXhlZCBxdWVyeV9zdGF0dXMoKQoreworICAgIGludCBpOworICAgIHN0cmluZyAqZmlsZXMsIHR4dDsKKyAgICAKKyAgICBpZiAoICF0aGlzX3BsYXllcigpICkKKyAgICAgICAgcmV0dXJuIGRlZXBfY29weShtb24pOworCisgICAgZmlsZXMgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobW9uKSwgIyc8LyonKi8gKTsKKyAgICB0eHQgPSAiR2VsZHF1ZWxsZW46XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGZpbGVzKTsgaS0tOyApCisgICAgICAgIHR4dCArPSBzcHJpbnRmKCAiJScuJy00OHMgOiAlOGQgKGgpICUxMGQgKGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbaV0sIG1vbltmaWxlc1tpXSwgMF0sIG1vbltmaWxlc1tpXSwgMV0gKTsKKworICAgIHRoaXNfcGxheWVyKCktPk1vcmUoIHR4dCApOworICAgIHJldHVybiAxOworfQorCisKKy8vIGtlaW5lIFNoYWRvd3MgYml0dGUKK3B1YmxpYyB2YXJhcmdzIGludCBxdWVyeV9wcmV2ZW50X3NoYWRvdyggb2JqZWN0IG9iICkgeyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vbmFtZWZha2UuYyBiL3AvZGFlbW9uL25hbWVmYWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxNDZiMgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL25hbWVmYWtlLmMKQEAgLTAsMCArMSw1NCBAQAorLyogRGllc2VzIE9iamVrdCBkaWVudCB6dW0gRmFrZW4gdm9uIE5hbWVuIGZ1ZXIgZGVuIENoYW5uZWxkLgorICogSGludGVyZ3J1bmQ6IGRlciBDaGFubmVsZCBicmF1Y2h0IGJlaW0gc2VuZCgpIGVpbiBPYmpla3QgKGJ6dy4gZGllIGluIGRlcgorICogVmVyYXJiZWl0dW5nIGRhbm4gZm9sZ2VuZGVuIFByb2dyYW1tZSkuIERlciBNdWRsaWJtYXN0ZXIgc2VuZGV0IE1lbGR1bmcgaW4KKyAqIGFuZGVyZXIgTGV1dGUgTmFtZW4gKGRlciBkYXJmIGRhcyBhdWNoKS4gRGFmdWVyIGNsb250IHVuZCBrb25maWd1cmllcnQgZXIKKyAqIGRpZXNlcyBPYmpla3QgdW5kIHVlYmVyZ2lidCBlcyBhbiBkZW4gY2hhbm5lbGQuIE5hY2ggM3MgcmFldW1lbiBzaWNoIENsb25lCisgKiBkaWVzZXMgT2JqZWt0ZXMgd2llZGVyIGF1Zi4KKyAqIEZhbGxzIGRlciBTcGllbGVyL05QQyBleGlzdGllcnQsIHdlbm4gZGllIG1lbGR1bmcgZ2VzZW5kZXQgd2lyZCwgd2lyZCB2b20KKyAqIE1hc3RlciBkYXMgcmljaHRpZ2UgT2JqZWt0IHVlYmVyZ2ViZW4sIG5pY2h0IGRpZXNlcyBoaWVyLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworaW5oZXJpdCAiL3N0ZC9zZWN1cmVfdGhpbmciOworCisvLyBFbnZjaGVjay1NZWNoYW5pc211cyBtaXNzYnJhdWNoZW4uIDstKQorcHJvdGVjdGVkIHZvaWQgY2hlY2tfZm9yX2Vudmlyb25tZW50KHN0cmluZyBjbG9uZXIpCit7CisgIGlmIChjbG9uZXAodGhpc19vYmplY3QoKSkpCisgICAgcmVtb3ZlKDEpOworfQorCisvLyBadXIgU2ljaGVyaGVpdCBhdWNoIGltIFJlc2V0Cit2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKGNsb25lcCh0aGlzX29iamVjdCgpKSkKKyAgICByZW1vdmUoMSk7Cit9CisKKy8vIEtvcGllIGF1cyAvc3RkL3RoaW5nL3Byb3BlcnRpZXMuYy4gTWFuIGJyYXVjaHQgZGF2b24gd29obCBrZWluCisvLyB6dWdhZW5nbGljaGVzIGluIGplZGVtIHRoaW5nLi4uCisvLyBXZWxjaGUgZXh0ZXJuZW4gT2JqZWt0ZSBkdWVyZmVuIHp1Z3JlaWZlbj8KK25vbWFzayBwcml2YXRlIGludCBhbGxvd2VkKCkKK3sKKyAgICBpZiAoIChwcmV2aW91c19vYmplY3QoKSAmJiBJU19BUkNIKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpICYmIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkgfHwKKyAgICAgICAgIChwcmV2aW91c19vYmplY3QoKSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpID09IFJPT1RJRCAmJgorICAgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpID09IFJPT1RJRCkgKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gU29sbHRlIG51ciB2b24gUk9PVCBvZGVyIEVNKyBtYW5pcHVsaWVydCB3ZXJkZW4uCisvLyBTcHJpY2gsIGRhcyB0dXQgc28sIGFscyBzZWllbiBhbGxlIFByb3BzIFNFQ1VSRUQKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFNldCggc3RyaW5nIG5hbWUsIG1peGVkIHZhbHVlLCBpbnQgdHlwZSwgaW50IGV4dGVybiApCit7CisgIGlmICgoZXh0ZXJuIHx8IGV4dGVybl9jYWxsKCkpCisgICAgICAmJiBwcmV2aW91c19vYmplY3QoKSAhPSB0aGlzX29iamVjdCgpCisgICAgICAmJiAhYWxsb3dlZCgpKSAvLyBhdXMgdGhpbmcvcHJvcGVydGllcy5jCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiA6OlNldChuYW1lLCB2YWx1ZSwgdHlwZSwgZXh0ZXJuKTsKK30KKwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vb2JqZWN0LmggYi9wL2RhZW1vbi9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdlMjBmCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vb2JqZWN0LmgKQEAgLTAsMCArMSwzOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIE9CSkVDVC5IIC0tIHBlcnNpc3RlbnQgb2JqZWN0IGhhbmRsaW5nCisvLworLy8gJERhdGU6IDE5OTUvMDMvMzEgMTM6MzA6MzMgJAorLy8gJFJldmlzaW9uOiAxLjEgJAorLyogJExvZzogb2JqZWN0LmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTUvMDMvMzEgIDEzOjMwOjMzICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4xICAxOTk0LzAzLzIwICAxNzowNzoyOCAgSGF0ZQorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworIAorI2lmbmRlZiBfX09CSkVDVF9IX18KKyNkZWZpbmUgX19PQkpFQ1RfSF9fCisKKy8vIGRlZmluZXMKKyNkZWZpbmUgT0JKRUNURCAgICAgICAiL3AvZGFlbW9uL29iamVjdGQiCisjZGVmaW5lIE9CSkVDVERfU0FWRSAgIi9wL2RhZW1vbi9zYXZlL29iamVjdGQiCisKKyNlbmRpZiAvLyBfX09CSkVDVF9IX18KKworI2lmZGVmIE5FRURfUFJPVE9UWVBFUworCisjaWZuZGVmIF9fT0JKRUNUX0hfUFJPVE9fXworI2RlZmluZSBfX09CSkVDVF9IX1BST1RPX18KKworLy8gcHJvdG90eXBlcworbWl4ZWQgQWRkT2JqZWN0KHN0cmluZyBvYmosIHN0cmluZyBlbnYpOworbWl4ZWQgUmVtb3ZlT2JqZWN0KHN0cmluZyBvYmosIHN0cmluZyBlbnYpOwordmFyYXJncyB2b2lkIFF1ZXJ5T2JqZWN0KG1peGVkIGVudik7CisKKworI2VuZGlmIC8vIF9fT0JKRUNUX0hfUFJPVE9fXworCisjZW5kaWYJLy8gTkVFRF9QUk9UT1lQRVMKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL29iamVjdGQuYyBiL3AvZGFlbW9uL29iamVjdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVkODIxCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vb2JqZWN0ZC5jCkBAIC0wLDAgKzEsMTUwIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gT0JKRUNURC5DIC0tIG9iamVjdCBkYWVtb24KKy8vCisvLyAkRGF0ZTogMTk5NS8wNC8wMyAxNDo0NzowMiAkCisvLyAkUmV2aXNpb246IDk1MTAgJAorLyogJExvZzogb2JqZWN0ZC5jLHYgJAorICogUmV2aXNpb24gMS4yICAxOTk1LzA0LzAzIDE0OjQ3OjAyICBXYXJnb24KKyAqIFF1ZXJ5T2JqZWN0KCkgdmVyd2VuZGV0IGJlaSBCbHVlUHJpbnRzIGpldHp0IGF1Y2ggQWRkSXRlbS4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTUvMDMvMzEgIDEzOjMwOjMzICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93CisKKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisKK21hcHBpbmcgb2JqZWN0cyA9IChbXSk7Citwcml2YXRlIG5vc2F2ZSBpbnQgZG9fc2F2ZTsKKworI2RlZmluZSBDTEFTUyAgIDAKKyNkZWZpbmUgREFUQSAgICAxCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisgIHJlc3RvcmVfb2JqZWN0KE9CSkVDVERfU0FWRSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICBpZiAoZG9fc2F2ZSkKKyAgeworICAgIHNhdmVfb2JqZWN0KE9CSkVDVERfU0FWRSk7CisgICAgZG9fc2F2ZT0wOworICB9Cit9CisKK3N0cmluZyBBZGRPYmplY3Qob2JqZWN0IG9iaiwgc3RyaW5nIGVudikKK3sKKyAgaWYoIW9iaiB8fCAhZW52IHx8ICFvYmplY3RwKG9iaikgfHwgIXN0cmluZ3AoZW52KSkKKyAgICByZXR1cm4gMDsKKworICAvLyBzYXZlIGluZm9ybWF0aW9uCisgIGlmKCFtZW1iZXIob2JqZWN0cywgZW52KSkKKyAgICBvYmplY3RzW2Vudl0gPSAoeyAoeyAgb2JqZWN0X25hbWUob2JqKSwgb2JqLT5RdWVyeVByb3AoUF9BVVRPTE9BRCkgfSkgfSk7CisgIGVsc2UKKyAgICBvYmplY3RzW2Vudl0gKz0gKHsgKHsgb2JqZWN0X25hbWUob2JqKSwgb2JqLT5RdWVyeVByb3AoUF9BVVRPTE9BRCkgfSkgfSk7CisKKyAgZG9fc2F2ZT0xOworICByZXR1cm4gZW52OworfQorCitpbnQgUmVtb3ZlT2JqZWN0KG9iamVjdHxzdHJpbmcgb2JqLCBzdHJpbmcgZW52KQoreworICBpZighb2JqIHx8ICFlbnYgfHwgIXN0cmluZ3AoZW52KSkKKyAgICByZXR1cm4gMDsKKworICAvLyBzYXZlIGluZm9ybWF0aW9uCisgIGlmKG1lbWJlcihvYmplY3RzLCBlbnYpKQorICB7CisgICAgbWl4ZWQgb2JsaXN0ID0gb2JqZWN0c1tlbnZdOworICAgIGZvcmVhY2gobWl4ZWQgYXJyOiAmb2JsaXN0KQorICAgIHsKKyAgICAgIGlmIChsb2FkX25hbWUoYXJyW0NMQVNTXSkgPT0gbG9hZF9uYW1lKG9iaikpCisgICAgICB7CisgICAgICAgIGFyciA9IDA7CisgICAgICAgIC8vIG51ciBlaW5zIEF1c3RyYWdlbiwgbmljaHQgYWxsZSwgZmFsbHMgbWVociBhbHMgZWlubWFsIGFuZ2VtZWxkZXQKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG9iamVjdHNbZW52XSA9IG9ibGlzdCAtICh7MH0pOworICB9CisgIGlmKCFzaXplb2Yob2JqZWN0c1tlbnZdKSkKKyAgICBtX2RlbGV0ZShvYmplY3RzLCBlbnYpOworCisgIGRvX3NhdmU9MTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEZyYWd0IG5pY2h0IHdpcmtsaWNoIGFiLCBzb25kZXJuIGVyc3RlbGx0IGRpZSBhbmdlbWVsZGV0ZW4gT2JqZWt0IGluIGVudi4KKy8vIFdlbm4ga2VpbiBlbnYsIHdpcmQgcHJldmlvdXNfb2JqZWN0KCkgZ2Vub21tZW4uCit2YXJhcmdzIHZvaWQgUXVlcnlPYmplY3Qoc3RyaW5nIGVudm5hbWUpCit7CisgIG9iamVjdCBlbnY7CisgIC8vIHRha2UgdGhlIGNhbGxlciBhcyB0aGUgcXVlc3Rpb25pbmcgb2JqZWN0CisgIGlmKCFlbnZuYW1lIHx8ICFzdHJpbmdwKGVudm5hbWUpKQorICAgIGVudiA9IHByZXZpb3VzX29iamVjdCgpOworICBlbHNlCisgICAgZW52ID0gZmluZF9vYmplY3QoZW52bmFtZSk7CisKKyAgLy8gdGFyZ2V0IG11c3QgYmUgYSBibHVlcHJpbnQKKyAgaWYoSVNfQ0xPTkUoZW52KSkgcmV0dXJuIDA7CisKKyAgZW52bmFtZT1vYmplY3RfbmFtZShlbnYpOworICBpZihtZW1iZXIob2JqZWN0cywgZW52bmFtZSkpCisgIHsKKyAgICBtaXhlZCBvYmxpc3QgPSBvYmplY3RzW2Vudm5hbWVdOworICAgIGZvcmVhY2gobWl4ZWQgYXJyIDogJm9ibGlzdCkKKyAgICB7CisgICAgICAgLy8gV2lyIG11ZXNzZW4gdW50ZXJzY2hlaWRlbiwgb2IgZWluIENsb25lIGFuZ2VtZWxkZXRlIHd1cmRlIG9kZXIgZWluZQorICAgICAgIC8vIEJsdWVwcmludC4KKyAgICAgICBvYmplY3QgbzsKKyAgICAgICBzdHJpbmcgKm4gPSBleHBsb2RlKGFycltDTEFTU10sICIjIik7CisgICAgICAgaWYgKHNpemVvZihuKSA+IDEgJiYgc2l6ZW9mKG5bMV0pID4gMCkKKyAgICAgICAgIG8gPSBlbnYtPkFkZEl0ZW0oblswXSwgUkVGUkVTSF9ERVNUUlVDVCk7CisgICAgICAgZWxzZQorICAgICAgICAgbyA9IGVudi0+QWRkSXRlbShuWzBdLCBSRUZSRVNIX0RFU1RSVUNULCAxKTsKKyAgICAgICBvLT5TZXRQcm9wKFBfQVVUT0xPQUQsIGFycltEQVRBXSk7CisgICAgICAgLy8gVW5kIGRhcyBuZXVlIE9iamVrdCBtZXJrZW4gKG5lIFZlcndlbmR1bmcgaGF0IGRhcyB6dXIgWmVpdCBhYmVyCisgICAgICAgLy8gbmljaHQpCisgICAgICAgYXJyW0NMQVNTXSA9IG9iamVjdF9uYW1lKG8pOworICAgIH0KKyAgfQorfQorCisvLyBMaWVmZXJ0IGVpbmUgTGlzdGUgZGVyIGluIGVudiBhbmdlbWVsZGV0ZW4gT2JqZWt0ZS4gV2VubiBrZWluIGVudiwgd2lyZAorLy8gcHJldmlvdXNfb2JqZWN0KCkgZ2Vub21tZW4uCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlPYmplY3RzKHN0cmluZyBlbnZuYW1lKQoreworICBvYmplY3QgZW52OworICAvLyB0YWtlIHRoZSBjYWxsZXIgYXMgdGhlIHF1ZXN0aW9uaW5nIG9iamVjdAorICBpZighZW52bmFtZSB8fCAhc3RyaW5ncChlbnZuYW1lKSkKKyAgICBlbnYgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgZWxzZQorICAgIGVudiA9IGZpbmRfb2JqZWN0KGVudm5hbWUpOworCisgIC8vIHRhcmdldCBtdXN0IGJlIGEgYmx1ZXByaW50CisgIGlmKElTX0NMT05FKGVudikpIHJldHVybiAwOworCisgIG1peGVkIGFycmFyciA9IG9iamVjdHNbb2JqZWN0X25hbWUoZW52KV07CisgIGlmIChhcnJhcnIpCisgIHsKKyAgICByZXR1cm4gQ291bnRVcChtYXAoYXJyYXJyLCAjJ1ssIENMQVNTKSwiLCAiLCIsICIpOworICB9CisgIHJldHVybiAwOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIHNhdmVfb2JqZWN0KE9CSkVDVERfU0FWRSk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3BhdGhkLmMgYi9wL2RhZW1vbi9wYXRoZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9wYXRoZC5jCkBAIC0wLDAgKzEsMTAwMCBAQAorLy8gRGFlbW9uIHp1bSBhdXRvbWF0aXNpZXJ0ZW4gRXJzdGVsbGVuIHZvbiBLYXJ0ZW4uCisvLyBTb2xsIHNwYWV0ZXIgbWFsIHdpY2h0aWdlIFdlZ2UgYmVyZWNobmVuIGtvZW5uZW4gZnVlciBBbmZhZW5nZXIuCisvLworLy8KKy8vIFdlciBtaXIgb2huZSB0cmlmdGlnZW4gR3J1bmQgZGFyYW4gaGVydW1wZnVzY2h0LCBkZXIgd2lyZCBzdGFuZGVzcmVjaHRsaWNoCisvLyBtaXQgZmF1bGVuIEVpZXJuIGJld29yZmVuLiBdOi0+CisvLworLy8gVGlhbWFrCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKKyNkZWZpbmUgTE9HTkFNRSAiUEFUSEQiCisjZGVmaW5lIFNBVkVGSUxFICIvcC9kYWVtb24vc2F2ZS9wYXRoZCIKKyNkZWZpbmUgRFVNUEZJTEUgIi9wL2RhZW1vbi9zYXZlL3BhdGhkLWR1bXAiCisvLyNkZWZpbmUgREVCVUcKKworLy8gMTAgdmVyc2NoaWVkZW5lIExldXRlIHdlcmRlbiBnZWJyYXVjaHQsIHVtIGVpbmUgVmVyYmluZHVuZyB6dSB2ZXJpZml6aWVyZW4KKyNkZWZpbmUgTkVFREVEIDEwCisjZGVmaW5lIFRJTUVPVVRfTkVXIDEyMDk2MDAgIC8vIDE0IFRhZ2UKKyNkZWZpbmUgVElNRU9VVF9PTEQgNzc3NjAwMCAvLyA5MCBUYWdlCisKKy8vIEFydCBkZXMgQXVzZ2FuZ3MKKyNkZWZpbmUgTk9STUFMICAwCisjZGVmaW5lIFNQRUNJQUwgMQorI2RlZmluZSBDT01NQU5EIDIKKworLy8gS29zdGVuIGZ1ZXIgdW50ZXJzY2hpZWRsaWNoZSBXZWdlCisjZGVmaW5lIENPU1RfRVhJVFMgKHsgMSwgMTAsIDEwMCB9KQorI2RlZmluZSBDT1NUX01BTlkgICAzCisjZGVmaW5lIENPU1RfRkVXICAgIDUKKyNkZWZpbmUgQ09TVF9PTkUgICAxMAorLy8gS29zdGVuIGZ1ZXIgV2VsdGVud2VjaHNlbCAoUGFyYSAtPiBOb3JtYWwpCisjZGVmaW5lIENPU1RfV09STERDSEFOR0UgMTAwCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeCkgaWYgKCBmaW5kX3BsYXllcigiemVzc3RyYSIpICkgXAorICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcigiemVzc3RyYSIpLCAoeCkrIlxuIiApOworI2RlZmluZSBURUxMX1VTRVIoeCkgaWYgKCB0aGlzX3BsYXllcigpICkgXAorICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCAoeCkrIlxuIiApOworI2Vsc2UKKyNkZWZpbmUgREJHKHgpCisjZGVmaW5lIFRFTExfVVNFUih4KQorI2VuZGlmCisKKyNkZWZpbmUgTE9HKHgpIGxvZ19maWxlKCAiUEFUSEQiLCAoeCksIDEwMDAwMCApOworCisvLyBWYXJpYWJsZW4KK25vc2F2ZSBpbnQgdGltZV90b19jbGVhbl91cDsgLy8gWmVpdCBmdWVyIG5hZWNoc3RlcyBDbGVhbnVwIGRlciBEYXRlbgorCittYXBwaW5nIHBhdGhtYXA7CisvKiBQcmVmaXggOiAoWyA8c3VibWFwPiBdKSwKKyAgIDxzdWJtYXA+IGlzdCBlaW4gTWFwcGluZyB2b24gUmFldW1lbiBtaXQgZWluZW0gQXJyYXkgdm9uIFZlcmJpbmR1bmdlbjoKKyAgIChbPHJvb20+OiAoeyBjb25uMSwgY29ubjIsIGNvbm4zLCAuLi59KSwgLi4uXSkKKyAgIEplZGUgVmVyYmluZHVuZyBpc3QgZWluIEFycmF5IG1pdCBmb2xnZW5kZW4gSW5kaXplczoKKyAgICovCisjZGVmaW5lIENPTk5fREVTVCAgICAgMCAgIC8vIFppZWxyYXVtCisjZGVmaW5lIENPTk5fQ01EICAgICAgMSAgIC8vIEtvbW1hbmRvCisjZGVmaW5lIENPTk5fVVNFUlMgICAgMiAgIC8vIEJlbnV0emVyOiAoe3NwaWVsZXIsIHNlaGVyfSkKKyNkZWZpbmUgQ09OTl9FWElUVFlQRSAzICAgLy8gQXVzZ2FuZ3NhcnQgKHMuby4pCisjZGVmaW5lIENPTk5fVElNRVMgICAgNCAgIC8vIFplaXQgbGV0enRlciBCZW51dHp1bmc6ICh7c3BpZWxlcixzZWhlcn0pCisjZGVmaW5lIENPTk5fUEFSQSAgICAgNSAgIC8vIFBhcmF3ZWx0CisjZGVmaW5lIENPTk5fRkxBR1MgICAgNiAgIC8vIEZsYWdzIGZ1ZXIgZGllIFZlcmJpbmR1bmcgKHouQi4gcGVybWFuZW50KQorLy8gSW5kaXplcyBpbiBDT05OX1VTRVJTLiBCZWlkZSBFaW50cmFlZ2Ugc2luZCBlbnR3ZWRlciBnZWhhc2h0ZSBVSURzIE9ERVIgLTEsCisvLyB3ZW5uIGRpZSBWZXJiaW5kdW5nIHZvbiBtZWhyIGFscyBORUVERUQgdW50ZXJzY2hpZWRsaWNoZW4gZ2VnYW5nZW4gd3VyZGUuCisjZGVmaW5lIENPTk5fVV9QTEFZRVJTIDAgIC8vIFNwaWVsZXItVUlEcworI2RlZmluZSBDT05OX1VfU0VFUlMgICAxICAvLyBTZWhlci1VSURTCisvLyBJbmRpemVzIHZvbiBDT05OX1RJTUVTLiBaZWl0c3RlbXBlbCBkZXIgbGV0enRlbiBCZW51dHp1bmcuLi4KKyNkZWZpbmUgQ09OTl9UX1BMQVlFUlMgQ09OTl9VX1BMQVlFUlMgIC8vIC4uLiBkdXJjaCBTcGllbGVyCisjZGVmaW5lIENPTk5fVF9TRUVSUyAgIENPTk5fVV9TRUVSUyAgLy8gLi4uIGR1cmNoIFNlaGVyCisKKy8vIEtvbnN0YW50ZW4gZnVlciBDT05OX0ZMQUdTCisjZGVmaW5lIENGTEFHX1BFUk1BTkVOVCAgIDB4MSAgLy8gVmVyYmluZHVuZyBuaWNodCBleHBpcmVuCisjZGVmaW5lIENGTEFHX0RPTlRVU0UgICAgIDB4MiAgLy8gVmVyYmluZHVuZyBuaWNodCBpbSBSb3V0aW5nIG51dHplbgorI2RlZmluZSBDRkxBR19EVVBMSUNBVEUgICAweDQgIC8vIEtvbW1hbmRvIGhhdCBtZWhyZXJlIFZlcmJpbmR1bmdlbgorCisvLyBsYXVmZW5kZSBQZmFkc3VjaGVuCitub3NhdmUgbWFwcGluZyBzZWFyY2hsaXN0ID0gKFtdKTsKKy8qCisgICAoWyA8dXVpZD4gOiBTTF9WSVNJVEVEOyBTTF9ERVNUSU5BVElPTjsuLi4gLi4uIF0pCisgKi8KKy8vIEluZGl6ZXMgaW4gPGRhdGE+OgorI2RlZmluZSBTTF9TVEFSVCAgICAgICAwCisjZGVmaW5lIFNMX0RFU1RJTkFUSU9OIDEgIC8vIFppZWxyYXVtCisjZGVmaW5lIFNMX1ZJU0lURUQgICAgIDIgIC8vIGFiZ2VsYXVmZW5lL2dlcHJ1ZWZ0ZSBSYWV1bWUKKyNkZWZpbmUgU0xfQ0FORElEQVRFUyAgMyAgLy8gbW9lZ2xpY2hlIFppZWxlCisjZGVmaW5lIFNMX1dJWkxFVkVMICAgIDQgIC8vIFdpemxldmVsCisjZGVmaW5lIFNMX1BBUkEgICAgICAgIDUgIC8vIFBhcmF3ZWx0CisjZGVmaW5lIFNMX1RPRE8gICAgICAgIDYgIC8vIG5vY2ggenUgcHJ1ZWZlbmRlIFJhdW1lIChTTF9DQU5ESURBVEVTLVNMX1ZJU0lURUQpCisjZGVmaW5lIFNMX0NBTExCQUNLICAgIDcgIC8vIENsb3N1cmUgZnVlciBDYWxsYmFjayBuYWNoIFJvdXRlbmJlcmVjaG51bmcKKy8vIFNMX0NBTkRJREFURVM6IChbPHJhdW0+OiAoe3ZlcmJpbmR1bmdzZGF0ZW59KSwgLi4uXSkKKy8vIEluZGl6ZXMgaW0gQXJyYXkgPHZlcmJpbmR1bmdzZGF0ZW4+OgorI2RlZmluZSBTTFRfQ09TVFMgICAgIDAgICAvLyBLb3N0ZW4gZnVlciBWZXJiaW5kdW5nIGJpcyBoaWVyCisjZGVmaW5lIFNMVF9XQVkgICAgICAgMSAgIC8vIGJpc2hlcmlnZXIgV2VnIHZvbiBTdGFydCBiaXMgaGllcgorI2RlZmluZSBTTFRfQ09NTUFORFMgIDIgICAvLyBLb21tYW5kb3MgZnVlciBXZWcgdm9uIFN0YXJ0IGJpcyBoaWVyCisKKy8vIGNhY2hlIGZ1ZXIgYmVyZWNobmV0ZSBXZWdlCitub3NhdmUgbWFwcGluZyBwYXRoY2FjaGUgPSAoW10pOworLy8gQXVmYmF1OiAoWyAic3RhcnRyYXVtIjogPGRlc3RzPiwgLi4uXSkKKy8vIDxkZXN0cz46IChbInppZWxyYXVtIjogPHdlZ2U+LCAuLi5dKQorLy8gPHdlZ2U+OiAoW3BhcmF3ZWx0OiAoPHN0cnVjdCBwYXRoX3M+KSBdKQorCitzdHJ1Y3QgcGF0aF9zIHsKKyAgICBpbnQgY29zdHM7ICAgICAgLy8gS29zdGVuIGRlcyBrb21wbGV0dGVuIFBmYWRlcworICAgIHN0cmluZyAqcm9vbXM7ICAvLyBMaXN0ZSB2b24gZHVyY2hsYXVmZW5lbiBSYWV1bWVuCisgICAgc3RyaW5nICpjbWRzOyAgIC8vIExpc3RlIHZvbiBLb21tYW5kb3MsIHVtIFJhZXVtZSB6dSBkdXJjaGxhdWZlbgorICAgIGludCB0dGw7ICAgICAgICAvLyB0aW1lLXRvLWxpdmUsIEFibGF1ZnplaXQgZGVzIFBmYWRzIGltIENhY2hlCisgICAgaW50IHBhcmE7ICAgICAgIC8vIFBhcmF3ZWx0CisgICAgaW50IGZsYWdzOyAgICAgIC8vIEZsYWdzIHp1IGRlbSBQZmFkCit9OworLy8gRmxhZ3MgZnVlciBQZmFkZSBpbSBQZmFkY2FjaGUKKyNkZWZpbmUgUEZMQUdfUEVSTUFORU5UIENGTEFHX1BFUk1BTkVOVAorI2RlZmluZSBQRkxBR19ET05UVVNFIENGTEFHX0RPTlRVU0UKKworCisvLyBQcm90b3R5cGVzCitwdWJsaWMgdm9pZCBjcmVhdGUoKTsKK3B1YmxpYyB2b2lkIGFkZF9wYXRocyggbWl4ZWQgY29ubmVjdGlvbnMgKTsKK3B1YmxpYyB2YXJhcmdzIHZvaWQgc2hvd19wYXRobWFwKCBzdHJpbmcgcGF0aCApOworcHVibGljIHZhcmFyZ3MgaW50IHNob3dfc3RhdGlzdGljKCBpbnQgdmVyYm9zZSwgaW50IHNpbGVudCApOworcHVibGljIGludCBjaGFuZ2VfcGF0aG1hcCggc3RyaW5nIHBmYWQsIG1peGVkICp2ZXJiaW5kdW5nZW4gKTsKK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRobWFwKCk7CitwdWJsaWMgdm9pZCByZXNldCgpOworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApOworcHVibGljIHZhcmFyZ3MgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCBvYmplY3Qgb2IgKTsKK3N0YXRpYyBpbnQgaW5zZXJ0X3BhdGhzKCBtaXhlZCAqcGF0aCApOworc3RhdGljIG1peGVkICpmb3JtYXRfcGF0aHMoIG1peGVkIGJ1ZiApOworc3RhdGljIHZvaWQgX3NlYXJjaCggc3RyaW5nIGZuYW1lLCBzdHJpbmcgc3RhcnQgKTsKK3ByaXZhdGUgc3RyaW5nIF9nZXRfcHJlZml4KCBzdHJpbmcgcGF0aCApOworcHJvdGVjdGVkIHZvaWQgY2xlYW51cF9kYXRhKCBzdHJpbmcgKm5hbWVzLCBpbnQgaWR4ICk7Citwcm90ZWN0ZWQgdm9pZCBleHBpcmVfcGF0aF9jYWNoZShzdHJpbmcgKnN0YXJ0cm9vbXMpOworCisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisgICAgLy8gd2lyIG11ZXNzZW4gZGFzIFNhdmVmaWxlIHNjaHJlaWJlbiBkdWVyZmVuCisgICAgc2V0ZXVpZChnZXR1aWQoKSk7CisKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKSB7CisgICAgICAgIHBhdGhtYXAgPSAoW10pOworICAgIH0KK30KKworCisvLyBXaXJkIHZvbiBTcGllbGVybiBhdWZnZXJ1ZmVuIG1pdCBkZW4gV2VnZW4sIGRpZSBzaWUgZ2VsYXVmZW4gc2luZAorcHVibGljIHZvaWQgYWRkX3BhdGhzKCBtaXhlZCBjb25uZWN0aW9ucyApCit7CisgICAgbWl4ZWQgcGF0aHM7CisKKyAgICAvLyBrZWluZW4gQXVmcnVmIHBlciBIYW5kIGJpdHRlCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgfHwgIXRoaXNfcGxheWVyKCkKKyAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSAhPSAiemVzc3RyYSIKKyAgICAgICAgIHx8IGZpbGVfc2l6ZSggIi9zdGQvc2hlbGxzIiArCisgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvZGUoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIjoiIClbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAiLmMiICkgPCAxICkKKyAgICAgICAgcmV0dXJuOworCisjaWYgX19CT09UX1RJTUVfXyA8IDEzNTcwNDIwOTIKKyAgICAvLyBhbHRlIFNwaWVsZXJvYmpla3RlIGxpZWZlcm4gbm9jaCBlaW4gQXJyYXkgdm9uIFN0cmluZ3Mgc3RhdHQgZWluZXMKKyAgICAvLyBBcnJheXMgdm9uIEFycmF5cy4KKyAgICBjb25uZWN0aW9ucyA9IG1hcChjb25uZWN0aW9ucywgZnVuY3Rpb24gbWl4ZWQgKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgLy8gQWxsZSBEYXRlbiBrb21tZW4gYWxzIGVpbiBTdHJpbmcgbWl0ICcjJyBhbHMgVHJlbm5lciBhbi4KKyAgICAgICAgICAvLyBNdXN0ZXI6IFN0YXJ0cmF1bSNaaWVscmF1bSNWZXJiI01ldGhvZGUgZGVyIEJld2VndW5nI1BhcmF3ZWx0CisgICAgICAgICAgbWl4ZWQgYnVmID0gZXhwbG9kZSggcGF0aCwgIiMiICk7CisgICAgICAgICAgLy8gRmFsbHMgaW0gVmVyYiBhdWNoICMgdm9ya2FtICh1bndhaHJzY2hlaW5saWNoLCBhYmVyIG1vZWdsaWNoKToKKyAgICAgICAgICBidWZbMi4uPDNdID0gKHsgaW1wbG9kZSggYnVmWzIuLjwzXSwgIiMiICkgfSk7CisgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfSAKKyAgICAgICAgKTsKKyNlbmRpZgorCisgICAgLy8gRGF0ZW4gYXVmYmVyZWl0ZW4KKyAgICBwYXRocyA9IG1hcCggY29ubmVjdGlvbnMsICMnZm9ybWF0X3BhdGhzLyonKi8gKSAtICh7MH0pOworICAgIC8vIE5ldWUgUmFldW1lIGVpbnRyYWdlbgorICAgIGZpbHRlciggcGF0aHMsICMnaW5zZXJ0X3BhdGhzLyonKi8gKTsKK30KKworcHVibGljIG1peGVkIGdldF9wYXRoX2Zyb21fY2FjaGUoc3RyaW5nIGZyb20sIHN0cmluZyB0bywgaW50IHBhcmEpIHsKKyAgICAvLyB3ZW5uIGltIENhY2hlLCBhdXMgZGVtIENhY2hlIGxpZWZlcm4uCisgICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW2Zyb21dOworICAgIGlmICh0YXJnZXRzKSB7CisgICAgICAgIG1hcHBpbmcgcGF0aHMgPSB0YXJnZXRzW3RvXTsKKyAgICAgICAgaWYgKHBhdGhzKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyKHBhdGhzLCBwYXJhKSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwYXRoX3MgcCA9IHBhdGhzW3BhcmFdOworICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPiB0aW1lKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoeyBmcm9tLCB0bywgcGFyYSwgcC0+Y29zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkocC0+cm9vbXMpLCBjb3B5KHAtPmNtZHMpIH0pOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX2RlbGV0ZShwYXRocywgcGFyYSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLyBTdWNoZnVua3Rpb24sIHVtIGRpZSBrdWVyemVzdGUgVmVyYmluZHVuZyB6d2lzY2hlbiB6d2VpIFJhZXVtZW4genUgZmluZGVuCitwdWJsaWMgaW50IFNlYXJjaFBhdGgoIHN0cmluZyBmcm9tLCBzdHJpbmcgdG8sIGludCBwYXJhLAorICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlIGNhbGxiYWNrKQoreworICAgIC8vIFBybyBVSUQgZGFyZiBlcyBudXIgZWluZW4gU3VjaGF1ZnRyYWcgZ2ViZW4uCisgICAgc3RyaW5nIHVpZD1nZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmICggbWVtYmVyKHNlYXJjaGxpc3QsdWlkKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB1bmQgbWVociBhbHMgNSBnbGVpY2h6ZWl0aWcgZXJzdG1hbCBhdWNoIG5pY2h0LgorICAgIGlmIChzaXplb2Yoc2VhcmNobGlzdCk+NCkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLy8gQW5mcmFnZSBsb2dnZW4KKyAgICBMT0coc3ByaW50ZigiJXM6IFN1Y2hlICVzIC0+ICVzICglZCkgdm9uICVzICglcywgJXMsICVzKVxuIiwKKyAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBmcm9tLCB0bywgcGFyYSwgdWlkLAorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICAgICBvYmplY3RfbmFtZSh0aGlzX3BsYXllcigpKSB8fCAiTk8tUEwiLAorICAgICAgICAgIG9iamVjdF9uYW1lKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwgIk5PLVRJIikgKTsKKworICAgIC8vIHdlbm4gU3RhcnQtIG9kZXIgWmllbHJhdW0gbmljaHQgYmVrYW5udCBzaW5kLCBrYW5uIGVzIGF1Y2gga2VpbmUgUm91dGUKKyAgICAvLyBnZWJlbi4KKyAgICBpZiAoIW1lbWJlcihwYXRobWFwW19nZXRfcHJlZml4KHRvKV0sdG8pCisgICAgICAgIHx8ICFtZW1iZXIocGF0aG1hcFtfZ2V0X3ByZWZpeChmcm9tKV0sZnJvbSkgKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBtaXhlZCBwYXRoID0gZ2V0X3BhdGhfZnJvbV9jYWNoZShmcm9tLCB0bywgcGFyYSk7CisgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrKQorICAgICAgICAgICAgYXBwbHkoY2FsbGJhY2sscGF0aCk7IAorICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICAvLyBEYXRlbnN0cnVrdHVyZXJrbGFlcnVuZzogcy5vLgorICAgIG1hcHBpbmcgdGFyZ2V0cyA9IG1fYWxsb2NhdGUoMTIwMCwzKTsKKyAgICBtX2FkZCh0YXJnZXRzLGZyb20sMCwoe30pLCh7fSkgKTsKKyAgICBzZWFyY2hsaXN0Kz0gKFsgdWlkOiBmcm9tOyB0bzsgKHt9KTsKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldHM7CisgICAgICAgICAgICAgICAgICAgICAocXVlcnlfd2l6X2xldmVsKHRoaXNfaW50ZXJhY3RpdmUoKSk/MTowKTsKKyAgICAgICAgICAgICAgICAgICAgIHBhcmE7ICh7fSk7IGNhbGxiYWNrXSk7CisKKyAgICAvLyBEaWUgZWlnZW50bGljaGUgU3VjaGUgc3RhcnRlbgorICAgIF9zZWFyY2goIHVpZCwgZnJvbSApOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIEdlc3BlaWNoZXJ0ZSBJbmZvcm1hdGlvbmVuIHp1IGVpbmVtIFJhdW0gb2RlciBlaW5lbSBrb21wbGV0dGVuIEdlYmlldAorLy8gYWJmcmFnZW4uIEdlYmlldGUgbGFzc2VuIHNpY2ggYWJlciBudXIgYWxzICJPcmdhbmlzYXRpb25zZWluaGVpdGVuIiBhYmZyYWdlbi4KKy8vIERhYmVpIHdlcmRlbiBHZWJpZXRlIHVudGVyaGFsYiB2b24gL2QvKiBhbHMgL2QvcmVnaW9uL21hZ2llcm5hbWUKKy8vIGFiZ2VzcGVpY2hlcnQgdW5kIGRlciBSZXN0IHVudGVyIGRlbiBlcnN0ZW4gYmVpZGVuIFRlaWxwZmFkZW4uCitwdWJsaWMgdmFyYXJncyB2b2lkIHNob3dfcGF0aG1hcCggc3RyaW5nIHBhdGggKQoreworICAgIHN0cmluZyBwcmU7CisKKyAgICBpZiAoIHBhdGggKQorICAgIHsKKyAgICAgICAgcHJlID0gX2dldF9wcmVmaXgocGF0aCk7CisKKyAgICAgICAgaWYgKCBwcmUgPT0gcGF0aCApCisgICAgICAgICAgICAvLyBHYW56ZW4gVGVpbGJhdW0gYXVzZ2ViZW4KKyAgICAgICAgICAgIHByaW50ZiggIlBhdGhtYXBbJU9dOiAlT1xuIiwgcGF0aCwgcGF0aG1hcFtwYXRoXSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyBOdXIgSW5mb3MgdWViZXIgZWluZW4gUmF1bSBhdXNnZWJlbgorICAgICAgICAgICAgcHJpbnRmKCAiUGF0aG1hcFslT106ICVPXG4iLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICBwYXRobWFwW3ByZV0gPyBwYXRobWFwW3ByZV1bcGF0aF0gOiAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgLy8gT2huZSBBcmd1bWVudCB3aXJkIGRpZSBnZXNhbXRlIE1hcCBhdXNnZWdlYmVuLgorICAgICAgICAvLyBLbGFwcHQgYWJlciBlaGVyIG5pY2h0IChtZWhyKSB3ZWdlbiBCdWZmZXIgb3ZlcmZsb3cuIDteKQorICAgICAgICBwcmludGYoICJQYXRobWFwOiAlT1xuIiwgcGF0aG1hcCApOworfQorCisKKy8vIFN0YXRpc3RpYyB6dSBkZW4gZ2VzcGVpY2hlcnRlbiBEYXRlbiBhbnplaWdlbi4KKy8vIE1pdCAndmVyYm9zZScgd2lyZCBqZWRlIE9yZ2FuaXNhdGlvbnNlaW5oZWl0IGVpbnplbG4gYXVmZ2VsaXN0ZXQsIG9obmUKKy8vIHdpcmQgZ3JvYiBuYWNoIFJlZ2lvbmVuIHp1c2FtbWVuZ2VmYXNzdC4KK3B1YmxpYyB2YXJhcmdzIGludCBzaG93X3N0YXRpc3RpYyggaW50IHZlcmJvc2UsIGludCBzaWxlbnQgKQoreworICAgIGludCBpLCBnZXM7CisgICAgc3RyaW5nICppbmQsIG5hbWU7CisgICAgbWFwcGluZyBtOworCisgICAgaWYgKCB2ZXJib3NlICl7IC8vIFN0dXIgamVkZW4gRWludHJhZyBhdWZsaXN0ZW4KKyAgICAgICAgaW5kID0gc29ydF9hcnJheSggbV9pbmRpY2VzKHBhdGhtYXApLCAjJzwvKicqLyApOworICAgICAgICBmb3IgKCBpID0gc2l6ZW9mKGluZCk7IGktLTsgKXsKKyAgICAgICAgICAgIGlmICggIXNpbGVudCApCisgICAgICAgICAgICAgICAgcHJpbnRmKCAiJS0zMHM6ICU0ZFxuIiwgaW5kW2ldLCBzaXplb2YocGF0aG1hcFtpbmRbaV1dKSApOworICAgICAgICAgICAgZ2VzICs9IHNpemVvZihwYXRobWFwW2luZFtpXV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAgICAgICAvLyBSZWdpb25lbiB6dXNhbW1lbmZhc3NlbgorICAgICAgICBpbmQgPSBtX2luZGljZXMocGF0aG1hcCk7CisgICAgICAgIG0gPSAoW10pOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2YoaW5kKTsgaS0tOyApeworICAgICAgICAgICAgaWYgKHN0cnN0cihpbmRbaV0sIi9kLyIpID09IDApCisgICAgICAgICAgICAgICAgLy8gL2QuLi4gamV3ZWlscyBuYWNoIHp3ZWkgVGVpbHBmYWRlbgorICAgICAgICAgICAgICAgIG5hbWUgPSBpbXBsb2RlKCBleHBsb2RlKCBpbmRbaV0sICIvIiApWzAuLjJdLCAiLyIgKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCBzdHJzdHIoaW5kW2ldLCIvcGxheWVycyIpID09IDApCisgICAgICAgICAgICAgICAgLy8gQWxsZSBQbGF5ZXJ2ZXJ6ZWljaG5pc3NlIHp1c2FtbWVuZmFzc2VuIC4uLgorICAgICAgICAgICAgICAgIG5hbWUgPSAiL3BsYXllcnMiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIC4uLiBkZW4gUmVzdCBuYWNoIGVpbmVtIFRlaWxwZmFkCisgICAgICAgICAgICAgICAgbmFtZSA9IGltcGxvZGUoIGV4cGxvZGUoIGluZFtpXSwgIi8iIClbMC4uMV0sICIvIiApOworCisgICAgICAgICAgICBpZiAoICFtW25hbWVdICkKKyAgICAgICAgICAgICAgICBtW25hbWVdID0gc2l6ZW9mKCBwYXRobWFwW2luZFtpXV0gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtW25hbWVdICs9IHNpemVvZiggcGF0aG1hcFtpbmRbaV1dICk7CisgICAgICAgIH0KKworICAgICAgICBpbmQgPSBzb3J0X2FycmF5KCBtX2luZGljZXMobSksICMnPC8qJyovICk7CisgICAgICAgIGZvciAoIGkgPSBzaXplb2YoaW5kKTsgaS0tOyApeworICAgICAgICAgICAgaWYgKCAhc2lsZW50ICkKKyAgICAgICAgICAgICAgICBwcmludGYoICIlLTMwczogJTRkXG4iLCBpbmRbaV0sIG1baW5kW2ldXSApOworICAgICAgICAgICAgZ2VzICs9IG1baW5kW2ldXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggIXNpbGVudCApCisgICAgICAgIHByaW50ZiggIlxuR2VzYW10OiAlZCBSYWV1bWUuXG4iLCBnZXMgKTsKKworICAgIHJldHVybiBnZXM7Cit9CisKKworLy8gTWFuaXB1bGllcmVuIGRlciBpbnRlcm5lbiBQYXRobWFwLiBOdXIgenVtIERlYnVnZ2VuIHVuZCBzb21pdAorLy8gbnVyIGZ1ZXIgWmVzc3RyYSBlcmxhdWJ0LiBTb25zdCB2ZXJodW56dCBtaXIgbm9jaCB3ZXIgbWVpbmUgRGF0ZW4uIDteKQorcHVibGljIGludCBjaGFuZ2VfcGF0aG1hcCggc3RyaW5nIHBmYWQsIG1peGVkICp2ZXJiaW5kdW5nZW4gKQoreworICAgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSAhPSAiemVzc3RyYSIKKyAgICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9ICJ6ZXNzdHJhIiApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICggbWFwcGluZ3AodmVyYmluZHVuZ2VuKSApeworICAgICAgICBpZiAoICFwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBwYXRobWFwW19nZXRfcHJlZml4KHBmYWQpXSA9IHZlcmJpbmR1bmdlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggIXBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHBhdGhtYXBbX2dldF9wcmVmaXgocGZhZCldW3BmYWRdID0gdmVyYmluZHVuZ2VuOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvLyBEaWUgRnVua3Rpb24gZ2lidCBhbGxlIGRlbSBwYXRoZCBiZWthbm50ZW4gUmFldW1lIGFscyBNYXBwaW5nIHZvbiBBcnJheXMKKy8vIHp1cnVlY2suIFNjaGz8c3NlbCBkZXMgTWFwcGluZ3Mgc2luZCBkYWJlaSBHZWJpZXRlLgorcHVibGljIG1hcHBpbmcgZ2V0X3Jvb21zKCkKK3sKKyAgc3RyaW5nICpzdWJtYXBzOworICBtYXBwaW5nIHJvb21tYXA7CisgIGludCBpOworCisgIHJvb21tYXA9KFtdKTsKKworICBzdWJtYXBzPW1faW5kaWNlcyhwYXRobWFwKTsKKworICBpPXNpemVvZihzdWJtYXBzKTsKKworICB3aGlsZSAoaS0tKQorICAgIGlmIChzaXplb2YobV9pbmRpY2VzKHBhdGhtYXBbc3VibWFwc1tpXV0pKSkKKyAgICAgICAgcm9vbW1hcFtzdWJtYXBzW2ldXT1tX2luZGljZXMocGF0aG1hcFtzdWJtYXBzW2ldXSk7CisKKyAgcmV0dXJuIHJvb21tYXA7Cit9CisKKy8vIERhdGVuIHp1IGVpbmVyIFZlcmJpbmR1bmcgc2FtbWVsbiB1bmQgYXVmYmVyZWl0ZW4KK3N0YXRpYyBtaXhlZCAqZm9ybWF0X3BhdGhzKCBtaXhlZCBidWYgKQoreworICAgIHN0cmluZyBjbWQsIHVpZDsKKyAgICBvYmplY3Qgb2I7CisgICAgbWFwcGluZyBleGl0czsKKyAgICBpbnQgYXJ0OworCisgICAgLy8gTWFnaWVyIHVuZCBUZXN0c3BpZWxlciBrb2VubmVuIGF1Y2ggaW4gbmljaHQgYW5nZXNjaGxvc3NlbmUgR2ViaWV0ZQorICAgIC8vIHVuZCB3ZXJkZW4gZGVzaGFsYiBuaWNodCBiZWFjaHRldC4KKyAgICBpZiAoIElTX0xFQVJORVIocHJldmlvdXNfb2JqZWN0KDEpKSB8fAorICAgICAgICAgSVNfTEVBUk5FUihsb3dlcl9jYXNlKCBwcmV2aW91c19vYmplY3QoMSktPlF1ZXJ5KFBfVEVTVFBMQVlFUil8fCIiICkpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjbWQgPSB0cmltKGJ1ZlsyXSxUUklNX0JPVEgpOworI2lmIF9fQk9PVF9USU1FX18gPCAxMzU3MDQyMDkyCisgICAgLy8gIiAwIiBhbSBFbmRlIGRlcyBCZWZlaGxzIGFic2NobmVpZGVuLiAqZ3J1bW1lbCoKKyAgICBpZiAoY21kWzwyLi5dPT0iIDAiKQorICAgICAgY21kID0gY21kWy4uPDNdOworI2VuZGlmCisKKyAgICAvLyBXZW5uIGRlciBaaWVscmF1bSBhbHMgU3RyaW5nIGFuZ2VnZWJlbiB3dXJkZSwga2FubiBkZXIgZnVlaHJlbmRlCisgICAgLy8gU2xhc2ggZmVobGVuIQorICAgIGlmICggYnVmWzFdWzBdICE9ICcvJyApCisgICAgICAgIGJ1ZlsxXSA9ICIvIiArIGJ1ZlsxXTsKKworICAgIC8vIFp1bSBBYmZyYWdlbiBkZXIgenVzYWV0emxpY2hlbiBEYXRlbiBicmF1Y2hlbiB3aXIgZGFzIE9iamVrdCBzZWxiZXIKKyAgICBjYXRjaChvYiA9IGxvYWRfb2JqZWN0KGJ1ZlswXSk7cHVibGlzaCk7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBLbGVpbmVyIEhhY2sgLSBiZWkgVHJhbnNwb3J0ZXJuIGV0Yy4gaXN0ICdvYicgZGllIG5pY2h0IGluaXRpYWxpc2llcnRlCisgICAgLy8gQmx1ZXByaW50LiBKZWRlIEFiZnJhZ2Ugdm9uIFBfRVhJVFMgd3VlcmRlIG5ldHQgYXVmIC1EZWJ1ZyBzY3JvbGxlbi4KKyAgICAvLyBEYSBQX0lEUyBpbSBjcmVhdGUoKSBhdWYgamVkZW4gRmFsbCBhdWYgZWluIEFycmF5IGdlc2V0enQgd2lyZCwKKyAgICAvLyBtaXNzYnJhdWNoZSBpY2ggZGFzIGhpZXIgYWxzICJJc3QgaW5pdGlhbGlzaWVydCItRmxhZy4KKyAgICBpZiAoICFvYi0+UXVlcnlQcm9wKFBfSURTKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQXJ0IGRlcyBBdXNnYW5ncyBmZXN0c3RlbGxlbi4gCisgICAgaWYgKCBtYXBwaW5ncChleGl0cyA9IG9iLT5RdWVyeVByb3AoUF9FWElUUykpICYmIGV4aXRzW2NtZF0gKQorICAgICAgICBhcnQgPSBOT1JNQUw7ICAgLy8gIm5vcm1hbGVyIiBBdXNnYW5nCisgICAgZWxzZSBpZiAoIG1hcHBpbmdwKGV4aXRzID0gb2ItPlF1ZXJ5UHJvcChQX1NQRUNJQUxfRVhJVFMpKSAmJiBleGl0c1tjbWRdICkKKyAgICAgICAgYXJ0ID0gU1BFQ0lBTDsgIC8vIFNwZWNpYWxFeGl0CisgICAgZWxzZSB7CisgICAgICAgIC8vIEtvbW1hbmRvcywgZGllIGVpbmVuIGluIGVpbmVuIGFuZGVyZW4gUmF1bSBicmluZ2VuCisgICAgICAgIGFydCA9IHRvX2ludChidWZbM10pOyAgIC8vIE1vdmUtTWV0aG9kZQorCisgICAgICAgIC8vIEVzIHphZWhsZW4gYWJlciBudXIgQmV3ZWd1bmdlbiwgZGllIGhhbGJ3ZWdzICJub3JtYWwiIGF1c3NlaGVuLAorICAgICAgICAvLyBkLmguIGtlaW4gTV9UUE9SVCwgTV9OT0NIRUNLIHVuZCBNX0dPIG11c3MgZ2VzZXR6dCBzZWluLgorICAgICAgICBpZiAoIGFydCAmIChNX1RQT1JUIHwgTV9OT0NIRUNLKSB8fCAhKGFydCAmIE1fR08pICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcnQgPSBDT01NQU5EOworICAgIH0KKworICAgIC8vIERpZSBVSUQgZGVyIFNwaWVsZXIvU2VoZXIgd2lyZCB2ZXJzY2hsdWVzc2VsdC4KKyAgICAvLyBTY2hsaWVzc2xpY2ggYnJhdWNoZW4gd2lyIHNpZSBudXIgZnVlciBzdGF0aXN0aXNjaGUgWndlY2tlIHVuZCBuaWNodCwKKyAgICAvLyB1bSBCZXdlZ3VuZ3Nwcm9maWxlIHp1IGVyc3RlbGxlbi4gY3J5cHQoKSByZWljaHQgZnVlciBkaWVzZSBad2Vja2UKKyAgICAvLyB3b2hsIGVyc3RtYWwuCisgICAgdWlkID0gZ2V0dWlkKHByZXZpb3VzX29iamVjdCgxKSk7CisgICAgdWlkID0gY3J5cHQoIHVpZCwgInczIiApOworCisgICAgLy8gU3RhcnQsIFppZWwsIFZlcmIsIFdpemxldmVsKFRQKSwgVUlEKFRQKSwgQXJ0IGRlcyBBdXNnYW5ncywgUGFyYXdlbHQKKyAgICByZXR1cm4gKHsgYnVmWzBdLCBidWZbMV0sIGNtZCwgcXVlcnlfd2l6X2xldmVsKHByZXZpb3VzX29iamVjdCgxKSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgIHVpZCwgYXJ0LCB0b19pbnQoYnVmWzRdKSB9KTsKK30KKworLy8gUHJ1ZWZ0IGFsbGUgVmVyYmluZHVuZ2VuIGltIEFycmF5IDxjb25ucz4sIHdlbGNoZSBkYXMgZ2xlaWNoZSBLb21tYW5kbyB3aWUKKy8vIDxjb25uPiBoYWJlbiwgb2Igc2llIGluIHVudGVyc2NoaWVkbGljaGUgUmFldW1lIGZ1ZWhyZW4uIFdlbm4gamEsIHNpbmQgc2llCisvLyBmdWVyIGRhcyBSb3V0aW5nIG5pY2h0IG51dHpiYXIuIEF1c25haG1lOiBWZXJiaW5kdW5nZW4sIGRpZSBpbgorLy8gdW50ZXJzY2hpZWRsaWNoZSBQYXJhd2VsdGVuIGZ1ZWhyZW4uCisvLyBBZW5kZXJ0IDxjb25ucz4gZGlyZWt0LgorcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25uc19ieV9jb25uKG1peGVkIGNvbm5zLCBtaXhlZCBjb25uKSB7CisgICAgZm9yZWFjaChtaXhlZCBjOiBjb25ucykgeworICAgICAgICBpZiAoIGNbQ09OTl9DTURdID09IGNvbm5bQ09OTl9DTURdCisgICAgICAgICAgICAmJiBjW0NPTk5fREVTVF0gIT0gY29ubltDT05OX0RFU1RdCisgICAgICAgICAgICAmJiBjW0NPTk5fUEFSQV0gPT0gY29ubltDT05OX1BBUkFdICkKKyAgICAgICAgeworICAgICAgICAgICAgY1tDT05OX0ZMQUdTXSB8PSBDRkxBR19EVVBMSUNBVEU7CisgICAgICAgICAgICBjb25uW0NPTk5fRkxBR1NdIHw9IENGTEFHX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgIH0KK30KKworcHJpdmF0ZSB2b2lkIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25ucyhtaXhlZCBjb25ucykgeworICAgIGZvcmVhY2gobWl4ZWQgYzogY29ubnMpCisgICAgICAgIGNoZWNrX2FuZF9tYXJrX2R1cGxpY2F0ZV9jb25uc19ieV9jb25uKGNvbm5zLCBjKTsKK30KKworCisvLyBOZXVlIFZlcmJpbmR1bmcgaW4gZGVyIERhdGVuYmFuayBlaW50cmFnZW4KK3N0YXRpYyBpbnQgaW5zZXJ0X3BhdGhzKCBtaXhlZCAqcGF0aCApCit7CisgICAgc3RyaW5nIHByZSA9IF9nZXRfcHJlZml4KHBhdGhbMF0pOworCisgICAgLy8gRmFsbHMgbm9jaCBnYXIga2VpbiBFaW50cmFnIGV4aXN0aWVydCwgbmV1IGluaXRpYWxpc2llcmVuCisgICAgaWYgKCAhbWFwcGluZ3AocGF0aG1hcFtwcmVdKSApCisgICAgICAgIHBhdGhtYXBbcHJlXSA9IChbXSk7CisKKyAgICBpZiAoICFwb2ludGVycChwYXRobWFwW3ByZV1bcGF0aFswXV0pICkKKyAgICAgICAgcGF0aG1hcFtwcmVdW3BhdGhbMF1dID0gKHt9KTsKKworICAgIC8vIEF1ZmJhdSB2b24gJ3BhdGgnOgorICAgIC8vICh7IFN0YXJ0LCBaaWVsLCBWZXJiLCBXaXpsZXZlbChUUCksIFVJRChUUCksIEFydCBkZXMgQXVzZ2FuZ3MsIFBhcmEgfSkKKyAgICAvLyBBdWZiYXUgdm9uICdjb25uJyAocy4gYXVjaCBnYW56IG9iZW4pCisgICAgLy8gKHsgWmllbCwgVmVyYiwgKHsgU3BpZWxlci1VSURzLCBTZWhlci1VSURzIH0pLCBBcnQgZGVzIEF1c2dhbmdzLAorICAgIC8vICAgKHsgTGV0enRlcyBCZXRyZXRlbiBkdXJjaCBTcGllbGVyLCBkdXJjaCBTZWhlciB9KSwgUGFyYXdlbHQgfSkKKworICAgIC8vIEFsbGUgVmVyYmluZHVuZ2VuIGRlcyBSYXVtZXMgZHVyY2hnZWhlbgorICAgIG1peGVkIGNvbm5zID0gcGF0aG1hcFtwcmVdW3BhdGhbMF1dOworICAgIC8vIEtvbW1hbmRvcyBkZXIgVmVyYmluZHVuZ2VuIHNhbW1lbG4uIFdlbm4gZXMgendlaSBWZXJiaW5kdW5nZW4gbWl0IGRlbQorICAgIC8vIGdsZWljaGVuIEtvbW1hbmRvIGdpYnQsIHNpbmQgYmVpZGUgdW5iZW51dHpiYXIuCisgICAgbWl4ZWQgY21kcyA9IG1fYWxsb2NhdGUoMTApOworICAgIGludCBpOworICAgIGZvciAoIGkgPSBzaXplb2YoY29ubnMpOyBpLS07ICkKKyAgICB7CisgICAgICAgIG1peGVkIGNvbm4gPSBjb25uc1tpXTsKKyAgICAgICAgbV9hZGQoY21kcyxjb25uW0NPTk5fQ01EXSk7IC8vIEtvbW1hbmRvcyBhbGxlciBDb25ucyBtZXJrZW4KKyAgICAgICAgLy8gV2VubiBaaWVscmF1bSwgVmVyYiB1bmQgUGFyYXdlbHQgcGFzc2VuIC4uLgorICAgICAgICBpZiAoIGNvbm5bQ09OTl9ERVNUXSA9PSBwYXRoWzFdICYmIGNvbm5bQ09OTl9DTURdID09IHBhdGhbMl0KKyAgICAgICAgICAgICAmJiBjb25uW0NPTk5fUEFSQV0gPT0gcGF0aFs2XSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlbm4gc2Nob24gZ2VudWcgTGV1dGUgZGllc2UgVmVyYmluZHVuZyBnZW51dHp0IGhhYmVuLCBlaW5mYWNoCisgICAgICAgICAgICAvLyBudXIgZGllIFplaXQgZGVyIGxldHp0ZW4gQmVudXR6dW5nIGFrdHVhbGlzaWVyZW4uCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwYXRoWzNdID8gQ09OTl9VX1NFRVJTIDogQ09OTl9VX1BMQVlFUlM7IC8vIFNlaGVyPworICAgICAgICAgICAgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2luZGV4XSA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtpbmRleF0gPSB0aW1lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbnNvbnN0ZW4gZGllIChuZXVlPykgVUlEIGhpbnp1ZnVlZ2VuIHVuZCBkaWUgWmVpdCBha3R1YWxpc2llcmVuLgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11baW5kZXhdID0KKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtpbmRleF0gLSAoeyBwYXRoWzRdIH0pICsgKHsgcGF0aFs0XSB9KTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemVvZihjb25uW0NPTk5fVVNFUlNdW2luZGV4XSkgPj0gTkVFREVEICkKKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtpbmRleF0gPSAtMTsKKworICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9USU1FU11baW5kZXhdID0gdGltZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMga2VpbmUgVmVyYmluZHVuZyBnZXBhc3N0IGhhdCwgZWluZSBuZXVlIGVyemV1Z2VuLgorICAgIGlmICggaSA8IDAgKSB7CisgICAgICAgIGludCBpbmRleCA9IHBhdGhbM10gPyBDT05OX1VfU0VFUlMgOiBDT05OX1VfUExBWUVSUzsgLy8gU2VoZXI/CisgICAgICAgIG1peGVkIHVpZHMgPSAoeyAoe30pLCAoe30pIH0pOworICAgICAgICB1aWRzW2luZGV4XSA9ICh7IHBhdGhbNF0gfSk7CisgICAgICAgIG1peGVkIHRpbWVzID0gKHsgMCwgMCB9KTsKKyAgICAgICAgdGltZXNbaW5kZXhdID0gdGltZSgpOworCisgICAgICAgIC8vIEF1ZmJhdSBzaWVoZSBvYmVuCisgICAgICAgIG1peGVkIGNvbm4gPSAoeyBwYXRoWzFdLCBwYXRoWzJdLCB1aWRzLCBwYXRoWzVdLCB0aW1lcywgcGF0aFs2XSwgMCB9KTsKKyAgICAgICAgY29ubnMgKz0gKHsgY29ubiB9KTsKKyAgICAgICAgLy8gd2VubiBkaWUgbmV1ZSBWZXJiaW5kdW5nIG5lbiBLb21tYW5kbyBiZW51dHp0LCB3ZWxjaGVzIHNjaG9uIGZ1ZXIKKyAgICAgICAgLy8gZWluZSBhbmRlcmUgVmVyYmluZHVuZyBhdXMgZGllc2VtIFJhdW0gYmVudXR6dCB3aXJkLCBzaW5kIGJlaWRlCisgICAgICAgIC8vIG5pY2h0IG51dHpiYXIsIGRhIGRhcyBaaWVsIG5pY2h0IGVpbmRldXRpZyBpc3QuIEluIGRpZXNlbSBGYWxsCisgICAgICAgIC8vIG11ZXNzZW4gYWxsZSBkaWVzZSBhbHMgdW5iZW51dHpiYXIgZnVlciBkYXMgUm91dGluZyBtYXJraWVydAorICAgICAgICAvLyB3ZXJkZW4uCisgICAgICAgIGlmIChtZW1iZXIoY21kcywgY29ubltDT05OX0NNRF0pKSB7CisgICAgICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnNfYnlfY29ubihjb25ucyxjb25uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhdGhtYXBbcHJlXVtwYXRoWzBdXSA9IGNvbm5zOworCisgICAgLy8gT2IgMCBvZGVyIDEgaXN0IGVpZ2VudGxpY2ggdG90YWwgZWdhbCwgZGEgZGFzIEVyZ2VibmlzLUFycmF5IHNvd2llc28KKyAgICAvLyB2ZXJ3b3JmZW4gd2lyZC4KKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSB2b2lkIGFkZF90b19jYWNoZShzdHJpbmcgZnJvbSwgc3RyaW5nIHRvLCBpbnQgcGFyYSwgaW50IGNvc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKnJvb21zLCBzdHJpbmcgKmNtZHMpIHsKKyAgICBzdHJ1Y3QgcGF0aF9zIHAgPSAoPHBhdGhfcz4gY29zdHMgOiBjb3N0cywgcm9vbXM6IHJvb21zLCBjbWRzIDogY21kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhOiBwYXJhLCBmbGFnczogMCwgdHRsOiB0aW1lKCkrODY0MDApOworICAgIGlmICghbWVtYmVyKHBhdGhjYWNoZSwgZnJvbSkpIHsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dID0gbV9hbGxvY2F0ZSgxKTsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dW3RvXSA9IG1fYWxsb2NhdGUoMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFtZW1iZXIocGF0aGNhY2hlW2Zyb21dLCB0bykpIHsKKyAgICAgICAgcGF0aGNhY2hlW2Zyb21dW3RvXSA9IG1fYWxsb2NhdGUoMSk7CisgICAgfQorICAgIHBhdGhjYWNoZVtmcm9tXVt0b11bcGFyYV0gPSBwOworfQorCisvLyBEaWVzZSBGdW5rdGlvbiBiZXJlY2huZXQgZGllIEtvc3RlbiBlaW5lciBWZXJiaW5kdW5nLgorLy8gRWluIFNlaGVyc3RhdHVzIHNjaGxpZXNzdCBkaWUgTW9lZ2xpY2hrZWl0ZW4gdm9uIFNwaWVsZXJuIGVpbiAoc2VoZXIKKy8vIGthbm4gU3BpZWxlcnBmYWRlIHByb2JsZW1sb3MgbnV0emVuKS4KKy8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIGluIGVpbmUgYW5kZXJlIFBhcmF3ZWx0IGZ1ZWhydCwgYWxzIGluIDxwYXJhPgorLy8gYW5nZWZyYWd0LCB3aXJkIHNpZSBlcmhlYmxpY2ggdGV1cmVyLgorcHJvdGVjdGVkIGludCBfY2FsY19jb3N0KG1peGVkKiBwYXRoLCBpbnQgc2VlciwgaW50IHBhcmEpCit7CisgICAgbWl4ZWQqIGludGVyZXN0PXBhdGhbQ09OTl9VU0VSU107CisKKyAgICAvLyBCYXNpc2tvc3RlbiBuYWNoIEF1c2dhbmdzYXJ0CisgICAgaW50IGNvc3RzID0gQ09TVF9FWElUU1twYXRoW0NPTk5fRVhJVFRZUEVdXTsKKworICAgIC8vIFZlcmJpbmR1bmdlbiBpbiBhbmRlcmUgYWxzIGRpZSBnZXd1ZW5zY2h0ZSBQYXJhd2VsdCB3ZXJkZW4gYmVpIGRlcgorICAgIC8vIHN1Y2hlIG5pY2h0IGJlcnVlY2tzaWNodGlndCwgYWJlciBWZXJiaW5kdW5nIHZvbiBQYXJhIG5hY2ggTm9ybWFsIHVuZAorICAgIC8vIHVtZ2VrZWhydCBzaW5kIGVybGF1YnQuIFBhcmEtPk5vcm1hbCBzb2xsIGFiZXIgZXR3YXMgdGV1cmVyIHNlaW4sIGRhbWl0CisgICAgLy8gZXMgYmV2b3J6dWd0IHdpcmQsIGluIGRlciBhbmdlZnJhZ3RlbiBXZWx0IHp1IGJsZWliZW4uCisgICAgLy8gKEhpbnRlcmdydW5kOiB3ZW5uIG1hbiBpbiBQYXJhIGlzdCwgbGFldWZ0IG1hbiBtZWlzdGVucyB0cm90emRlbSBkdXJjaAorICAgIC8vIE5vcm1hbHdlbHRyYWV1bWUsIHdlaWwgZXMga2VpbmUgcGFzc2VuZGVuIFBhcmFyYWV1bWUgZ2lidCkuCisgICAgaWYgKHBhcmEgIT0gcGF0aFtDT05OX1BBUkFdKQorICAgICAgICBjb3N0cyArPSBDT1NUX1dPUkxEQ0hBTkdFOworCisgICAgLy8gd2VubiBzY2hvbiBnZW51ZyB1bnRlcnNjaGllZGxpY2hlIExldXRlIGRpZSBWZXJiaW5kdW5nIGdlbGF1ZmVuIHNpbmQsCisgICAgLy8ga29zdGV0IGVzIGRpZSBCYXNpc2tvc3Rlbi4gRnVlciBTZWhlciBhdWNoIGRpZSBTcGllbGVyIGVpbnNjaGxpZXNzZW4uCisgICAgaWYgKGludGVyZXN0W0NPTk5fVV9QTEFZRVJTXT09LTEKKyAgICAgICAgfHwgKHNlZXIgJiYgaW50ZXJlc3RbQ09OTl9VX1NFRVJTXT09LTEpKQorICAgICAgICByZXR1cm4gY29zdHM7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU29uc3Qgd2lyZCBkaWUgVmVyYmluZHVuZyB0ZXVyZXIuCisgICAgICAgIC8vIEFuemFobCBTcGllbGVybnV0emVyIGthbm4gbmljaHQgLTEgc2VpbiAocy5vLikuCisgICAgICAgIGludCB1c2VyY291bnQgPSBzaXplb2YoaW50ZXJlc3RbQ09OTl9VX1BMQVlFUlNdKTsKKyAgICAgICAgLy8gd2VubiA8c2Vlcj4sIHdpcmQgZ2dmLiBkaWUgQW56YWhsIGFuIFNlaGVybnV0emVybiBkcmF1ZiBhZGRpZXJ0LgorICAgICAgICAvLyBXZXJ0IGZ1ZXIgU2VoZXIga2FubiBuaWNodCAtMSBzZWluIChzLm8uKQorICAgICAgICBpZiAoc2VlcikKKyAgICAgICAgICAgIHVzZXJjb3VudCArPSBzaXplb2YoaW50ZXJlc3RbQ09OTl9VX1NFRVJTXSk7CisgICAgICAgIHN3aXRjaCAodXNlcmNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29zdHM9MTAwMDAwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMS4uMjoKKyAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9PTkU7CisgICAgICAgICAgICBjYXNlIDMuLjQ6CisgICAgICAgICAgICAgICAgY29zdHMqPUNPU1RfRkVXOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb3N0cyo9Q09TVF9NQU5ZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3N0czsKKyAgICB9CisgICAgREJHKHNwcmludGYoIkh1Y2gsIGtlaW5lIEFobnVuZywgS29zdGVuIHVuYmVzdGltbWJhcjogJU8iLHBhdGgpKTsKKyAgICByZXR1cm4gMTAwMDsKK30KKworLy8gTmV1aW1wbGVtZW50YXRpb24gdm9uIEh1bW5pLCBiZW51dHp0IGVpbmZhY2ggc2ltcGVsIGVpbmVuCisvLyBEaWprc3RyYS1BbGdvcml0aG11cy4gIlNpbXBlbCIgc2NocmVpYmUgaWNoLCBiZXZvciBpY2ggZGllCisvLyBGdW5rdGlvbiBzY2hyZWliZSwgZmx1Y2hlbiB3ZXJkZSBpY2ggZ2xlaWNoLgorc3RhdGljIHZvaWQgX3NlYXJjaChzdHJpbmcgZm5hbWUsIHN0cmluZyBmcm9tKQoreworICAgIC8vIDxmcm9tPiBpc3QgamV0enQgYW56dWd1Y2tlbmRlL3p1IGJlYXJiZWl0ZW5kZSBSYXVtLgorCisgICAgLy8gRGllIGFrdHVlbGxlIExpc3RlIGFuIGFiZ2VzdWNodGVuIFJhZXVtZW4sIFJhZXVtZSwgaW4gZGVuZW4KKyAgICAvLyBhbGxlIFdlZ2UgYmVyZWl0cyBlaW5nZXRyYWdlbiBzaW5kLgorICAgIHN0cmluZyogcm9vbXNfc2VhcmNoZWQ9c2VhcmNobGlzdFtmbmFtZSxTTF9WSVNJVEVEXTsKKworICAgIC8vIFppZWxvcnQKKyAgICBzdHJpbmcgdG8gPSBzZWFyY2hsaXN0W2ZuYW1lLFNMX0RFU1RJTkFUSU9OXTsKKworICAgIC8vIG1vZWdsaWNoZSBaaWVsZQorICAgIG1hcHBpbmcgdGFyZ2V0cz1zZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTkRJREFURVNdOworCisgICAgLy8gd2l6bGV2ZWwKKyAgICBpbnQgc2VlciA9IHNlYXJjaGxpc3RbZm5hbWUsU0xfV0laTEVWRUxdOworCisgICAgLy8gcGFyYQorICAgIGludCBwYXJhPXNlYXJjaGxpc3RbZm5hbWUsU0xfUEFSQV07CisKKyAgICAvLyBOb2NoIHp1IGJlYXJiZWl0ZW5kZSBSYWV1bWUKKyAgICBzdHJpbmcqIHRvX2RvPXNlYXJjaGxpc3RbZm5hbWUsU0xfVE9ET107CisKKyAgICBEQkcoIl9zZWFyY2goKSBzdGFydC4iKTsKKworICAgIHdoaWxlICgoZ2V0X2V2YWxfY29zdCgpPjkwMDAwMCkgJiYgZnJvbSAmJiAoZnJvbSAhPSB0bykpCisgICAgeworICAgICAgICAvLyBGdWVnZSBkZW4gYWt0dWVsbGVuIFJhdW0gKGZyb20pIGFscyBXZWcgaGluenUKKyAgICAgICAgREJHKHNwcmludGYoIkZ1ZWdlIGhpbnp1OiAlcyIsZnJvbSkpOworICAgICAgICByb29tc19zZWFyY2hlZCs9KHtmcm9tfSk7CisgICAgICAgIC8vIEF1cyBkZW4gUmFldW1lbiBkcnVtcnVtIHdlcmRlbiBkaWUgQXVzZ2FlbmdlIGdlc3VjaHQKKyAgICAgICAgLy8gdW5kIHp1ciBXZWdsaXN0ZSBoaW56dWdlZnVlZ3QuCisKKyAgICAgICAgLy8gUGZhZGUgdm9uIDxmcm9tPiB3ZWcgYXVzIGRlciBMaXN0ZSBob2xlbgorICAgICAgICBtaXhlZCogcGF0aHM9cGF0aG1hcFtfZ2V0X3ByZWZpeChmcm9tKV1bZnJvbV07CisKKyAgICAgICAgLy8gTGlzdGUgZGVyIFZlcmJpbmR1bmdlbiB2b24gPGZyb20+IGR1cmNoZ2VoZW4KKyAgICAgICAgZm9yZWFjaCAobWl4ZWQgY29ubjpwYXRocykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG5ld2Nvc3Q7CisgICAgICAgICAgICAvLyB3ZW5uIGRlciBSYXVtIHNjaG9ubWFsIGdlc2VoZW4gd3VyZGUsIGlzdCBoaWVyIG5peCBtZWhyIG5vZXRpZy4KKyAgICAgICAgICAgIGlmIChtZW1iZXIocm9vbXNfc2VhcmNoZWQsY29ubltDT05OX0RFU1RdKT4tMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkcoc3ByaW50ZigiUmF1bSAlcyBoYWIgaWNoIHNjaG9uISIsY29ubltDT05OX0RFU1RdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVmVyYmluZHVuZyBqZSBuYWNoIEZsYWcgbmljaHQgbnV0emVuLiBBdXNzZXJkZW06CisgICAgICAgICAgICAgICAgLy8gd2VubiBkaWUgVmVyYmluZHVuZyBpbiBlaW5lIFBhcmF3ZWx0IGZ1ZWhydCwgYWJlciBrZWluCisgICAgICAgICAgICAgICAgLy8gU2VoZXJzdGF0dXMgZ2VnZWJlbiBpc3QsIGV4aXN0aWVydCBkaWUgVmVyYmluZHVuZyBuaWNodC4KKyAgICAgICAgICAgICAgICAvLyBXZWl0ZXJoaW4ga29tbXQgZWluZSBWZXJiaW5kdW5nIG5pY2h0IGluIEZyYWdlLCB3ZW5uIHNpZSBpbgorICAgICAgICAgICAgICAgIC8vIGVpbmUgYW5kZXJlIFBhcmF3ZWx0IGZ1ZWhydCwgd2VpbCBkZXIgV2VsdHVlYmVyZ2FuZyBudXIgYW4KKyAgICAgICAgICAgICAgICAvLyBiZXN0aW1tdGVuIE9ydGVuIG1vZWdsaWNoIGlzdC4gQXVzbmFobWUgZGF2b24gc2luZCBXZWNoc2VsCisgICAgICAgICAgICAgICAgLy8gendpc2NoZW4gTm9ybWFsd2VsdCB1bmQgUGFyYXdlbHQuCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RPTlRVU0UpCisgICAgICAgICAgICAgICAgICAgIHx8IChjb25uW0NPTk5fRkxBR1NdICYgQ0ZMQUdfRFVQTElDQVRFKQorICAgICAgICAgICAgICAgICAgICB8fCAoIXNlZXIgJiYgY29ubltDT05OX1BBUkFdKQorICAgICAgICAgICAgICAgICAgICB8fCAoY29ubltDT05OX1BBUkFdICYmIGNvbm5bQ09OTl9QQVJBXSAhPSBwYXJhKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIG5ld2Nvc3QgPSB0YXJnZXRzW2Zyb20sU0xUX0NPU1RTXTsgLy8ga29zdGVuIGJpcyBoaWVyaGVyCisgICAgICAgICAgICAgICAgLy8gKyBLb3N0ZW4gaW4gbmFlY2hzdGVuIFJhdW0uCisgICAgICAgICAgICAgICAgbmV3Y29zdCArPSBfY2FsY19jb3N0KGNvbm4sc2VlcixwYXJhKTsKKyAgICAgICAgICAgICAgICAvLyBlcyBrb2VubnRlIHNlaW4sIGRhc3MgZXMgVmVyYmluZHVuZ2VuIG1pdCBnbGVpY2hlbQorICAgICAgICAgICAgICAgIC8vIFN0YXJ0L1ppZWwgZ2lidCwgYWJlciB1bnRlcnNjaGllZGxpY2hlbiBLb3N0ZW4uIEluIGRpZXNlbQorICAgICAgICAgICAgICAgIC8vIEZhbGwgd3VlcmRlIGRhcyBaaWVsIGRlciBha3R1ZWxsZW4gVmVyYmluZHVuZyBtZWhyZmFjaAorICAgICAgICAgICAgICAgIC8vIGhpbnp1Z2VmdWVndCB1bmQgZGFzIGxldHp0ZSBnZXdpbm50LiBEYWhlciBzb2xsdGUgZGllc2UKKyAgICAgICAgICAgICAgICAvLyBWZXJiaW5kdW5nIG51ciBoaW56dWdlZnVlZ3Qgd2VyZGVuLCB3ZW5uIG5vY2gga2VpbmUKKyAgICAgICAgICAgICAgICAvLyBWZXJiaW5kdW5nIGluIGRlbiBaaWVscmF1bSBleGlzdGllcnQsIGRpZSBiaWxsaWdlciBpc3QuCisgICAgICAgICAgICAgICAgaWYgKG1lbWJlcih0YXJnZXRzLGNvbm5bQ09OTl9ERVNUXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbmV3Y29zdCA+PSB0YXJnZXRzW2Nvbm5bQ09OTl9ERVNUXSxTTFRfQ09TVFNdKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBXZWcgYmlzIGhpZXJoZXIgcGx1cyBuYWVjaHN0ZW4gUmF1bQorICAgICAgICAgICAgICAgIHN0cmluZyogbmV3X3dheSA9IHRhcmdldHNbZnJvbSxTTFRfV0FZXTsKKyAgICAgICAgICAgICAgICBuZXdfd2F5ICs9ICh7Y29ubltDT05OX0RFU1RdfSk7CisgICAgICAgICAgICAgICAgLy8gS29tbWFuZG9zIGJpcyBoaWVyaGVyIHBsdXMgbmFlY2hzdGVzIEtvbW1hbmRvCisgICAgICAgICAgICAgICAgc3RyaW5nKiBuZXdfY29tbWFuZHMgPSB0YXJnZXRzW2Zyb20sU0xUX0NPTU1BTkRTXTsKKyAgICAgICAgICAgICAgICBuZXdfY29tbWFuZHMgKz0gKHtjb25uW0NPTk5fQ01EXX0pOworICAgICAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBSYXVtIGluIFRvZG8gZnVlciBkaWUgUHJ1ZWZ1bmcgdW50ZW4gdmVybWVya2VuCisgICAgICAgICAgICAgICAgdG9fZG8gKz0gKHtjb25uW0NPTk5fREVTVF19KTsKKyAgICAgICAgICAgICAgICAvLyBVbmQgS29zdGVuL1dlZy9Lb21tYW5kb3MgYmlzIHp1bSBuYWVjaHN0ZW4gUmF1bSB1bnRlcgorICAgICAgICAgICAgICAgIC8vIHRhcmdldHMvS2FuZGlkYXRlbiBhYmxlZ2VuLgorICAgICAgICAgICAgICAgIHRhcmdldHMgKz0gKFtjb25uW0NPTk5fREVTVF06bmV3Y29zdDtuZXdfd2F5O25ld19jb21tYW5kc10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5hY2hkZW0gZGllIFJhZXVtZSBhbGxlIHp1IGRlbiBLYW5kaWRhdGVuIGFuIG1vZWdsaWNoZW4gV2VnZW4KKyAgICAgICAgLy8gaGluenVnZWZ1ZWd0IHd1cmRlbiwgd2lyZCBudW4gZGVyIG5ldWVzdGUga3Vlcnplc3RlIFdlZyBnZXN1Y2h0LgorICAgICAgICAvLyBOYXR1ZXJsaWNoIG51ciBhdXMgZGVuZW4sIGRpZSBzY2hvbiBkYSBzaW5kLgorICAgICAgICBpZiAoc2l6ZW9mKHRvX2RvKT4wKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBLb3N0ZW4gZGVzIGVyc3RlbiB0b2RvIGFscyBTdGFydHdlcnQgbmVobWVuCisgICAgICAgICAgICBzdHJpbmcgbWlucmF1bTsKKyAgICAgICAgICAgIGludCBtaW5jb3N0cz1fX0lOVF9NQVhfXzsKKyAgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIHRvZG9zIGxhdWZlbiB1bSBkYXMgTWluaW11bSB6dSBmaW5kZW4uCisgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyByYXVtOiB0b19kbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWluY29zdHM+dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU10pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5yYXVtID0gcmF1bTsKKyAgICAgICAgICAgICAgICAgICAgbWluY29zdHM9dGFyZ2V0c1tyYXVtLFNMVF9DT1NUU107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHKHNwcmludGYoIk5ldWVyIGt1ZXJ6ZXN0ZXIgUmF1bTogJXMiLG1pbnJhdW0pKTsKKworICAgICAgICAgICAgLy8gZGVyIGJpbGxpZ3N0IHp1IGVycmVpY2hlbmRlIFJhdW0gd2lyZCBkYXMgbmV1ZSA8ZnJvbT4gZnVlciBkZW4KKyAgICAgICAgICAgIC8vIG5hZWNoc3RlbiBEdXJjaGxhdWYKKyAgICAgICAgICAgIGZyb209bWlucmF1bTsKKyAgICAgICAgICAgIC8vIHVuZCBuYXR1ZXJsaWNoIGF1cyBkZW0gdG9fZG8gd2VyZmVuLgorICAgICAgICAgICAgdG9fZG8tPSh7bWlucmF1bX0pOworICAgICAgICAgICAgREJHKHNwcmludGYoIkFuemFobCB1bnRlcnN1Y2h0ZXIgUmFldW1lOiAlZCwgVG9kbzogJWQsICIKKyAgICAgICAgICAgICAgICAgICJLYW5kaWRhdGVuOiAlZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Yocm9vbXNfc2VhcmNoZWQpLHNpemVvZih0b19kbyksc2l6ZW9mKHRhcmdldHMpKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcm9tPTA7CisgICAgICAgIH0KKyAgICB9IC8vIHdoaWxlIGVuZGUKKworICAgIGlmICghZnJvbSkKKyAgICB7CisgICAgICAgIC8vIEhtcGYuLi4KKyAgICAgICAgVEVMTF9VU0VSKCJLZWluIFdlZyBnZWZ1bmRlbiEiKTsKKyAgICAgICAgaWYgKHNlYXJjaGxpc3RbZm5hbWUsIFNMX0NBTExCQUNLXSkKKyAgICAgICAgICAgIGZ1bmNhbGwoc2VhcmNobGlzdFtmbmFtZSxTTF9DQUxMQkFDS10sCisgICAgICAgICAgICAgICAgICAgIHNlYXJjaGxpc3RbZm5hbWUsU0xfU1RBUlRdLCB0bywgcGFyYSwKKyAgICAgICAgICAgICAgICAgICAgMCwwLDApOworICAgICAgICBtX2RlbGV0ZSggc2VhcmNobGlzdCwgZm5hbWUgKTsgIC8vIHN1Y2hhdWZ0cmFnIGVudHNvcmdlbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGZyb209PXRvKQorICAgIHsKKyAgICAgICAgLy8gSlVDSFUhCisgICAgICAgIFRFTExfVVNFUihzcHJpbnRmKCJXZWcgZ2VmdW5kZW4hICVPLCVPLCVPIiwKKyAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09TVFNdLHRhcmdldHNbdG8sU0xUX1dBWV0sCisgICAgICAgICAgICAgIHRhcmdldHNbdG8sU0xUX0NPTU1BTkRTXSkpOworICAgICAgICBhZGRfdG9fY2FjaGUoc2VhcmNobGlzdFtmbmFtZSxTTF9TVEFSVF0sIHRvLCBwYXJhLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09TVFNdLHRhcmdldHNbdG8sU0xUX1dBWV0sCisgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT01NQU5EU10pOworICAgICAgICBpZiAoc2VhcmNobGlzdFtmbmFtZSwgU0xfQ0FMTEJBQ0tdKQorICAgICAgICAgICAgZnVuY2FsbChzZWFyY2hsaXN0W2ZuYW1lLFNMX0NBTExCQUNLXSwKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNobGlzdFtmbmFtZSxTTF9TVEFSVF0sIHRvLCBwYXJhLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRzW3RvLFNMVF9DT1NUU10sdGFyZ2V0c1t0byxTTFRfV0FZXSwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0byxTTFRfQ09NTUFORFNdKTsKKyAgICAgICAgbV9kZWxldGUoIHNlYXJjaGxpc3QsIGZuYW1lICk7ICAvLyBzdWNoYXVmdHJhZyBlbnRzb3JnZW4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlbm4gZGFzIGFsbGVzIG5pY2h0IHdhciwgd2FyZW4gZXMgZGllIEV2YWwtVGlja3MuIE1pc3QuIFNwYWV0ZXIKKyAgICAvLyB3ZWl0ZXJzdWNoZW4uLi4KKyAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1ZJU0lURURdPXJvb21zX3NlYXJjaGVkOworICAgIHNlYXJjaGxpc3RbZm5hbWUsU0xfQ0FORElEQVRFU109dGFyZ2V0czsKKyAgICBzZWFyY2hsaXN0W2ZuYW1lLFNMX1RPRE9dPXRvX2RvOworICAgIGNhbGxfb3V0KCJfc2VhcmNoIiwyLGZuYW1lLGZyb20pOworfQorCisKKy8vIERpZSBEYXRlbiB1ZWJlciBSYWV1bWUgd2VyZGVuIHF1YXNpIGdlaGFzaHQgYWJnZXNwZWljaGVydCwgZGFtaXQgd2lyIG5pY2h0CisvLyBzbyBzY2huZWxsIGFuIGRpZSBCZWdyZW56dW5nIGJlaSBBcnJheXMgdW5kIE1hcHBpbmdzIHN0b3NzZW4uCisvLyBEYWJlaSBpc3QgZGVyICdIYXNoJyBkZXIgQW5mYW5nIGRlcyBQZmFkZXMuCitwcml2YXRlIHN0cmluZyBfZ2V0X3ByZWZpeCggc3RyaW5nIHBhdGggKQoreworICAgIHN0cmluZyAqdG1wOworCisgICAgdG1wID0gZXhwbG9kZSggcGF0aCwgIi8iICk7CisKKyAgICAvLyBCZWkgUmFldW1lbiB1bnRlcmhhbGIgdm9uIC9kLyogd2lyZCAvZC9yZWdpb24vbWFnaWVybmFtZSBiZW51dHp0CisgICAgaWYgKCBzdHJzdHIocGF0aCwgIi9kLyIpID09IDApCisgICAgICAgIHJldHVybiBpbXBsb2RlKCB0bXBbMC4uM10sICIvIiApOworICAgIC8vIEFuc29uc3RlbiBkaWUgZXJzdGVuIGJlaWRlbiBUZWlscGZhZGUsIGZhbGxzIHNvdmllbGUgdm9yaGFuZGVuIHNpbmQKKyAgICBlbHNlIGlmICggc2l6ZW9mKHRtcCkgPCA0ICkKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIHRtcFswLi4xXSwgIi8iICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gaW1wbG9kZSggdG1wWzAuLjJdLCAiLyIgKTsKK30KKworLy8gUmVzZXQgdW5kIERhdGVuaGFsdHVuZworLy8gcmVzZXQgd2lyZCBhbGxlIDNoIGdlcnVmZW4sIHVtIGRhcyBTYXZlZmlsZSBpbW1lciBtYWwgd2llZGVyIHp1IHNwZWljaGVybi4KKy8vIERhdGVuYXVmcmFldW1lbiBhYmVyIG51ciBlaW5tYWwgcHJvIFRhZy4KK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgICBpZiAoIHRpbWVfdG9fY2xlYW5fdXAgPD0gdGltZSgpICkKKyAgICB7CisgICAgICAgIC8vIEVpbm1hbCBwcm8gVGFnIFJlc2V0IHp1bSBBdWZyYWV1bWVuIGRlciBEYXRlbmJhbmsKKyAgICAgICAgcm0oRFVNUEZJTEUiLnJhZXVtZSIpOworICAgICAgICBybShEVU1QRklMRSIuY29ubnMiKTsKKyAgICAgICAgdGltZV90b19jbGVhbl91cCA9IHRpbWUoKSArIDg2NDAwOworICAgICAgICBleHBpcmVfcGF0aF9jYWNoZShtX2luZGljZXMocGF0aGNhY2hlKSk7CisgICAgICAgIGNhbGxfb3V0KCMnY2xlYW51cF9kYXRhLCAzMCwKKyAgICAgICAgICAgICAgICAgIHNvcnRfYXJyYXkobV9pbmRpY2VzKHBhdGhtYXApLCAjJzwvKicqLyksIDAgKTsKKworICAgIH0KKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgICAgc2V0X25leHRfcmVzZXQoMTA4MDApOworfQorCitwcm90ZWN0ZWQgdm9pZCBleHBpcmVfcGF0aF9jYWNoZShzdHJpbmcgKnN0YXJ0cm9vbXMpIHsKKyAgICBmb3JlYWNoKHN0cmluZyBzdGFydCA6IHN0YXJ0cm9vbXMpIHsKKyAgICAgICAgbWFwcGluZyB0YXJnZXRzID0gcGF0aGNhY2hlW3N0YXJ0XTsKKyAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHRhcmdldCwgbWFwcGluZyBwYXRoczogdGFyZ2V0cykgeworICAgICAgICAgICAgZm9yZWFjaChpbnQgcGFyYSwgc3RydWN0IHBhdGhfcyBwOiBwYXRocykgeworICAgICAgICAgICAgICAgIGlmIChwLT50dGwgPCB0aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIShwLT5mbGFncyAmIFBGTEFHX1BFUk1BTkVOVCkgKQorICAgICAgICAgICAgICAgICAgICBtX2RlbGV0ZShwYXRocyxwYXJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2l6ZW9mKHBhdGhzKSkKKyAgICAgICAgICAgICAgICBtX2RlbGV0ZSh0YXJnZXRzLCB0YXJnZXQpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0cm9vbXMtPSh7c3RhcnR9KTsKKyAgICAgICAgaWYgKCFzaXplb2YodGFyZ2V0cykpCisgICAgICAgICAgICBtX2RlbGV0ZShwYXRoY2FjaGUsIHN0YXJ0KTsKKyAgICAgICAgLy8gcmVjaHQgZ3Jvc3NlciBXZXJ0LCB3ZWlsIGltbWVyIGtvbXBsZXR0ZSBTdGFydHJhZXVtZSBpbiBlaW5lbQorICAgICAgICAvLyBlcmxlZGlndCB3ZXJkZW4uCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzaXplb2Yoc3RhcnRyb29tcykpCisgICAgICAgIGNhbGxfb3V0KCMnZXhwaXJlX3BhdGhfY2FjaGUsIDQsIHN0YXJ0cm9vbXMpOworfQorCisvLyBEYXRlbmJhbmsgYXVmcmFldW1lbgorcHJvdGVjdGVkIHZvaWQgY2xlYW51cF9kYXRhKCBzdHJpbmcgKm5hbWVzLCBpbnQgaWR4ICkKK3sKKyAgICBpbnQgc2l6ZSwgaSwgaiwgazsKKyAgICBzdHJpbmcgKnJvb21zOworICAgIG1peGVkICpwYXRoczsKKworICAgIHNpemUgPSBzaXplb2YobmFtZXMpOworCisgICAgLy8gRWluIGJpc3NlcmwgbWl0bG9nZ2VuLCBkYW1pdCB3aXIgU2Nod2FjaHN0ZWxsZW4gaW0gU3lzdGVtIGF1Y2ggZmluZGVuLgorICAgIGlmICggIWlkeCApeworICAgICAgICBMT0coIHNwcmludGYoIj09PSAlczogU3RhcnRlIGNsZWFudXBfZGF0YSgpOiAlTyBHZWJpZXRlLCAlTyBSYWV1bWUgIgorICAgICAgICAgICAgICAgICAgICAgKyAiLi4uXG4iLCBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGF0aXN0aWMoMSwgMSkgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HKCBzcHJpbnRmKCIlczogU2V0emUgY2xlYW51cF9kYXRhKCkgZm9ydC5cbiIsCisgICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIikgKSApOworICAgIH0KKworICAgIC8vIEJyYXYgZ2VzcGxpdHRldCwgZGFtaXQgZXMga2VpbiBMYWcgZ2lidC4KKyAgICAvLyBEaWUgR3JlbnplIGlzdCByZWNodCBob2NoIGFuZ2VzZXR6dCwgZGEgaW1tZXIgZ2xlaWNoIGtvbXBsZXR0ZQorICAgIC8vIFRlaWxiYWV1bWUgYXVmZ2VyYWV1bXQgd2VyZGVuLgorICAgIHdoaWxlICggZ2V0X2V2YWxfY29zdCgpID4gMTEwMDAwMCAmJiBpZHggPCBzaXplICl7CisgICAgICAgIHJvb21zID0gc29ydF9hcnJheSggbV9pbmRpY2VzKHBhdGhtYXBbbmFtZXNbaWR4XV0pLCAjJzwvKicqLyApOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2Yocm9vbXMpOyBpLS07ICl7CisgICAgICAgICAgICBwYXRocyA9IHBhdGhtYXBbbmFtZXNbaWR4XV1bcm9vbXNbaV1dOworICAgICAgICAgICAgaW50IGNvbm5fY291bnQgPSBzaXplb2YocGF0aHMpOworICAgICAgICAgICAgbWFwcGluZyBjbWRzPW1fYWxsb2NhdGUoc2l6ZW9mKHBhdGhzKSk7CisKKyAgICAgICAgICAgIGZvciAoIGogPSBjb25uX2NvdW50OyBqLS07ICkgeworICAgICAgICAgICAgICAgIG1peGVkIGNvbm4gPSBwYXRoc1tqXTsKKyAgICAgICAgICAgICAgICBmb3IgKCBrID0gMDsgayA8IDI7IGsrKyApIHsgLy8gU3BpZWxlci9TZWhlcmVpbnRyYWVnZQorICAgICAgICAgICAgICAgICAgICAvLyBEaWVzZSBWZXJiaW5kdW5nIGhhdCBub2NoIGtlaW5lciBnZW51dHp0IGJpc2hlcgorICAgICAgICAgICAgICAgICAgICBpZiAoICFjb25uW0NPTk5fVElNRVNdW2tdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvLyBXZW5uIFZlcmJpbmR1bmcgcGVybWFuZW50LCB1ZWJlcnNwcmluZ2VuCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uW0NPTk5fRkxBR1NdICYgQ0ZMQUdfUEVSTUFORU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjb25uW0NPTk5fVVNFUlNdW2tdID09IC0xIC8vICdiZWthbm50ZXMnIEdlYmlldAorICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUoKSAtIGNvbm5bQ09OTl9USU1FU11ba10gPiBUSU1FT1VUX09MRCApeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTE9HKCBzcHJpbnRmKCIqKiogTG9lc2NoZSBhbHRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICsgKGsgPyAiU2VoZXIiIDogIlNwaWVsZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgKyAiLVZlcmJpbmR1bmcgJU8uXG4iLCBwYXRoc1tqXSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5bQ09OTl9VU0VSU11ba10gPSAoe30pOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1RJTUVTXVtrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGNvbm5bQ09OTl9VU0VSU11ba10gIT0gLTEgLy8gJ25ldWVzJyBHZWJpZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUoKSAtIGNvbm5bQ09OTl9USU1FU11ba10gPiBUSU1FT1VUX05FVyApeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX1VTRVJTXVtrXSA9ICh7fSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVElNRVNdW2tdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFdlbm4gZWluZSBWZXJiaW5kdW5nIHdlZGVyIHZvbiBTcGllbGVybiBub2NoIHZvbiBTZWhlcm4KKyAgICAgICAgICAgICAgICAvLyBiZW51dHp0IHd1cmRlIGluIGxldHp0ZXIgWmVpdCB1bmQgc2llIGtlaW5lIHBlcm1hbmVudGVkCisgICAgICAgICAgICAgICAgLy8gaXN0LCBWZXJiaW5kdW5nIGdhbnogbG9lc2NoZW4uCisgICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX1BFUk1BTkVOVCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbm5bQ09OTl9USU1FU11bQ09OTl9UX1BMQVlFUlNdCisgICAgICAgICAgICAgICAgICAgICYmICFjb25uW0NPTk5fVElNRVNdW0NPTk5fVF9TRUVSU10gKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzW2ouLmpdID0gKHt9KTsgLy8gY29ubiByYXVzd2VyZmVuCisgICAgICAgICAgICAgICAgICAgIGNvbm5fY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb25zIG5hY2ggS29tbWFuZG9zIHNwZWljaGVybi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlcihjbWRzLCBjb25uW0NPTk5fQ01EXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzW2Nvbm5bQ09OTl9DTURdXSArPSAoe2Nvbm59KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY21kc1tjb25uW0NPTk5fQ01EXV0gPSAoe2Nvbm59KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5kIGRhcyBkdXBsaWNhdGUgZmxhZyBsb2VzY2hlbiwgZGFzIHdpcmQgc3BhZXRlciBuZXUKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2VzZXR6dCwgd2VubiBub2V0aWcuCisgICAgICAgICAgICAgICAgICAgIC8vIChUaGVyZSBpcyBubyBjaGFuY2UgdGhhdCBhIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgY29ubmVjdGlvbnMgdW50aWwgdGhleSBhcmUgbWFya2VkIGFnYWluLikKKyAgICAgICAgICAgICAgICAgICAgY29ubltDT05OX0ZMQUdTXSAmPSB+Q0ZMQUdfRFVQTElDQVRFOworICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9ucyBkdW1wZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29ubltDT05OX0ZMQUdTXSAmIENGTEFHX0RVUExJQ0FURSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBtaXhlZCB1PSh7Y29ubltDT05OX1VTRVJTXVtDT05OX1VfUExBWUVSU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fVVNFUlNdW0NPTk5fVV9TRUVSU10gfSk7CisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZmlsZShEVU1QRklMRSIuY29ubnMiLHNwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXN8JXN8JXN8JWR8JWR8JWR8JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tc1tpXSxjb25uW0NPTk5fREVTVF0sY29ubltDT05OX0NNRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uW0NPTk5fRVhJVFRZUEVdLGNvbm5bQ09OTl9QQVJBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1WzBdPT0tMSA/IDAgOiBORUVERUQtc2l6ZW9mKHVbMF0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1WzBdPT0tMSA/IDAgOiBORUVERUQtc2l6ZW9mKHVbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVpbiBSYXVtIG9obmUgVmVyYmluZHVuZ2VuIGZyaXNzdCBudXIgUGxhdHogaW4gZGVyIERhdGVuYmFuaworICAgICAgICAgICAgaWYgKCAhY29ubl9jb3VudCApeworICAgICAgICAgICAgICAgIC8vIExPRyggc3ByaW50ZigiKioqIExvZXNjaGUga29tcGxldHRlbiBSYXVtICVPXG4iLCByb29tc1tpXSkgKTsKKyAgICAgICAgICAgICAgICBtX2RlbGV0ZSggcGF0aG1hcFtuYW1lc1tpZHhdXSwgcm9vbXNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlbm4gS29tbWFuZG9zIG5pY2h0IGVpbmRldXRpZyBzaW5kLCBkYW5uIHdlcmRlbiBkaWUKKyAgICAgICAgICAgICAgICAvLyBlbnRzcHJlY2hlbmRlbiBWZXJiaW5kdW5nZW4gZ2VrZW5uemVpY2huZXQuIEFsbGUgaW4gRnJhZ2UKKyAgICAgICAgICAgICAgICAvLyBrb21tZW5kZW4gVmVyYmluZHVuZ2VuIHNpbmQgamV3ZWlscyBzY2hvbiB6dXNhbW1lbnNvcnRpZXJ0LgorICAgICAgICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGNtZCwgbWl4ZWQgY29ubnMgOiBjbWRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplb2YoY29ubnMpPjEpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19hbmRfbWFya19kdXBsaWNhdGVfY29ubnMoY29ubnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBnZ2YuIGdlYWVuZGVydGVzIFZlcmJpbmR1bmdzYXJyYXkgd2llZGVyIGlucyBNYXBwaW5nCisgICAgICAgICAgICAgICAgLy8gc2NocmVpYmVuLgorICAgICAgICAgICAgICAgIHBhdGhtYXBbbmFtZXNbaWR4XV1bcm9vbXNbaV1dID0gcGF0aHM7CisgICAgICAgICAgICAgICAgLy8gUmF1bS9Ob2RlIGlucyBEdW1wIHNjaHJlaWJlbgorICAgICAgICAgICAgICAgIHdyaXRlX2ZpbGUoRFVNUEZJTEUiLnJhZXVtZSIsc3ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIscm9vbXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZHgrKzsKKyAgICB9CisgICAgaWYgKCBpZHggPj0gc2l6ZSApIHsKKyAgICAgICAgTE9HKCBzcHJpbnRmKCI9PT0gJXM6IEJlZW5kZSBjbGVhbnVwX2RhdGEoKSEgVWVicmlnOiAlTyBSYWV1bWUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwgc2hvd19zdGF0aXN0aWMoMSwgMSkgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2FsbF9vdXQoICMnY2xlYW51cF9kYXRhLCAyLCBuYW1lcywgaWR4ICk7CisgICAgICAgIExPRyggc3ByaW50ZigiJXM6IFdBUlRFIDIwcyBiZWkgRXZhbGNvc3QgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLCBnZXRfZXZhbF9jb3N0KCkpICk7CisgICAgfQorfQorCisvLyBCZWltIEVudGxhZGVuIHNwZWljaGVybgorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgICAgLy8gVm9yIGRlbSBFbnRmZXJuZW4gbm9jaCBzY2huZWxsIGRpZSBEYXRlbiBzaWNoZXJuCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIDE7Cit9CisKKworLy8gWnVtIERlYnVnZ2VuLiBOdXIgZvxyIFRpYW1hay4gQnp3LiBudW4gZnVlciBab29rLCBWYW5pb24sIFJ1bWF0YQorI2RlZmluZSBBTExPV0VEICh7Inpvb2siLCJ2YW5pb24iLCJydW1hdGEiLCJ6ZXNzdHJhIiwiaHVtbmkifSkKKyNkZWZpbmUgTUFUQ0goeCx5KSAoc2l6ZW9mKHJlZ2V4cCh4LHkpKSkKK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRobWFwKCkKK3sKKyAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFNQVRDSChBTExPV0VELGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgIHx8ICFwcmV2aW91c19vYmplY3QoKSB8fCAhTUFUQ0goQUxMT1dFRCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICAgICAgcmV0dXJuIChbXSk7CisKKyAgICByZXR1cm4gcGF0aG1hcDsKK30KK3B1YmxpYyBtYXBwaW5nIGdldF9wYXRoY2FjaGUoKQoreworICBpZiAoICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIU1BVENIKEFMTE9XRUQsZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgfHwgIXByZXZpb3VzX29iamVjdCgpIHx8ICFNQVRDSChBTExPV0VELGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpKQorICAgICAgICByZXR1cm4gKFtdKTsKKworICAgIHJldHVybiBwYXRoY2FjaGU7Cit9CisKKyN1bmRlZiBBTExPV0VECisjdW5kZWYgTUFUQ0gKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3JvdXRpbmdkLmMgYi9wL2RhZW1vbi9yb3V0aW5nZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTMzODIKLS0tIC9kZXYvbnVsbAorKysgYi9wL2RhZW1vbi9yb3V0aW5nZC5jCkBAIC0wLDAgKzEsMjAyIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgREJfTkFNRSAiL3AvZGFlbW9uL3NhdmUvcm91dGluZ2QiCisjZGVmaW5lIE1BWF9MRU4gNTAKKyNkZWZpbmUgVFAgdGhpc19wbGF5ZXIoKQorCittYXBwaW5nIGRvbWFpbnM7CittYXBwaW5nIGV4aXRzOworbWFwcGluZyB0YXJnZXRzOworc3RhdGljIG1hcHBpbmcgZGlyZWN0aW9uczsKK3N0YXRpYyBtYXBwaW5nIHJldmVyc2VfZGlyZWN0aW9uczsKKwordm9pZCBjcmVhdGUoKSB7CisgICAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmICghcmVzdG9yZV9vYmplY3QoREJfTkFNRSkpIHsKKyAgICBkb21haW5zPShbIi9kLyI6MV0pOworICAgIGV4aXRzPShbXSk7CisgICAgdGFyZ2V0cz0oW10pOworICB9CisKKyAgLy8gVW1zZXR6dW5nIHp1ciBTcGVpY2hlcmVyc3Bhcm5pczoKKyAgZGlyZWN0aW9ucz0oWyJub3JkZW4iOjEsCisJICAgICAgICJub3Jkb3N0ZW4iOjIsCisJICAgICAgICJvc3RlbiI6MywKKwkgICAgICAgInN1ZWRvc3RlbiI6NCwKKwkgICAgICAgIm9iZW4iOjUsCisJICAgICAgICJzdWVkZW4iOi0xLAorCSAgICAgICAic3VlZHdlc3RlbiI6LTIsCisJICAgICAgICJ3ZXN0ZW4iOi0zLAorCSAgICAgICAibm9yZHdlc3RlbiI6LTQsCisJICAgICAgICJ1bnRlbiI6LTUKKwkgICAgICAgXSk7CisgIHJldmVyc2VfZGlyZWN0aW9ucz0oWzE6Im5vcmRlbiIsCisJCSAgICAgICAyOiJub3Jkb3N0ZW4iLAorCQkgICAgICAgMzoib3N0ZW4iLAorCQkgICAgICAgNDoic3VlZG9zdGVuIiwKKwkJICAgICAgIDU6Im9iZW4iLAorCQkgICAgICAgLTE6InN1ZWRlbiIsCisJCSAgICAgICAtMjoic3VlZHdlc3RlbiIsCisJCSAgICAgICAtMzoid2VzdGVuIiwKKwkJICAgICAgIC00OiJub3Jkd2VzdGVuIiwKKwkJICAgICAgIC01OiJ1bnRlbiIKKwkJICAgICAgIF0pOworfQorCisvLyBGdWVyIERlYnVnLVplY2tlOgorbWl4ZWQgcXVlcnlfZXhpdHMoc3RyaW5nIHJvb20pIHtyZXR1cm4gZXhpdHNbcm9vbV07fQorbWl4ZWQgcXVlcnlfdGFyZ2V0cyhzdHJpbmcgdHlwKSB7cmV0dXJuIHRhcmdldHNbdHlwXTt9CisKK2ludCBBZGREb21haW4oc3RyaW5nIGRvbSwgaW50IHZhbCkgeworICAvLyBGdWVndCBuZXVlIERvbWFpbiBoaW56dSwgaW4gZGVyIFJvdXRpbmcgbW9lZ2xpY2ggc2VpbiBzb2xsLgorICAvLyArMTogRWluc2NobGllc3NlbgorICAvLyAtMTogQXVzc2NobGllc3NlbgorICBpZiAoIUlTX0FSQ0goVFApCisgICAgICB8fCB2YWw8LTEKKyAgICAgIHx8IHZhbD4xKQorICAgIHJldHVybiAwOworICBpZiAoIXZhbCkKKyAgICBkb21haW5zPW1fY29weV9kZWxldGUoZG9tYWlucyxkb20pOworICBlbHNlCisgICAgZG9tYWluc1tkb21dPXZhbDsKKyAgc2F2ZV9vYmplY3QoREJfTkFNRSk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVnaXN0ZXJUYXJnZXQoc3RyaW5nIHR5cGUsIHN0cmluZyBmbmFtZSkgeworICAvLyBSZWdpc3RyaWVydCBSYXVtIGFscyB6dSBlaW5lciBHcnVwcGUgdm9uIFppZWxlbiB6dWdlaG9lcmlnCisgIC8vICh6LkIuIFJlZ2lzdGVyVGFyZ2V0KCJwdWIiLCIvZC9lYmVuZS9yb29tL1BvcnRWYWluL3B1YjIiKSkKKyAgbWFwcGluZyBtYXBfbGRmaWVkOworCisgIGlmICghdHlwZSB8fCAhZm5hbWUpCisgICAgcmV0dXJuIDA7CisgIHR5cGU9bG93ZXJfY2FzZSh0eXBlKTsKKyAgaWYgKHR5cGVbMC4uMV0hPSIjIyIpCisgICAgdHlwZT0iIyMiK3R5cGU7CisgIGlmICghbWFwcGluZ3AobWFwX2xkZmllZD10YXJnZXRzW3R5cGVdKSkKKyAgICBtYXBfbGRmaWVkPShbXSk7CisgIG1hcF9sZGZpZWRbZm5hbWVdPTE7CisgIHRhcmdldHNbdHlwZV09bWFwX2xkZmllZDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBSZWdpc3RlckV4aXQoc3RyaW5nIHN0YXJ0LCBtaXhlZCByaWNodHVuZ2VuLCBzdHJpbmcgemllbCkgeworICAvLyBSZWdpc3RyaWVydCBBdXNnYW5nIGluIGRlciBhbmdlZ2ViZW5lbiBSaWNodHVuZyB2b24gU3RhcnQgbmFjaCBaaWVsLAorICAvLyB3ZW5uIFJvdXRpbmcgZG9ydCBtb2VnbGljaCBzZWluIHNvbGwuCisgIHN0cmluZyAqZGlyczsKKyAgaW50IGksc3osb2sscG9zOworICBtaXhlZCBleCx4LHJpY2h0dW5nOworICAKKyAgaWYgKHN0cmluZ3AocmljaHR1bmdlbikpCisgICAgcmljaHR1bmdlbj0oe3JpY2h0dW5nZW59KTsKKyAgaWYgKCFzdGFydCB8fCAhcG9pbnRlcnAocmljaHR1bmdlbikgfHwgIXppZWwpCisgICAgcmV0dXJuIDA7CisgIGRpcnM9b2xkX2V4cGxvZGUoc3RhcnQsIi8iKTtzej1zaXplb2YoZGlycyktMTt4PSIvIjtvaz0wOworICBmb3IgKGk9MDtpPHN6O2krKykgeworICAgIHg9eCtkaXJzW2ldKyIvIjsKKyAgICBpZiAoZG9tYWluc1t4XT09LTEpIC8vIFN1YmRvbWFpbiBhdXNnZXNjaGxvc3Nlbj8KKyAgICAgIHJldHVybiAwOworICAgIGlmIChkb21haW5zW3hdPT0xKSAvLyBEb21haW4gZXJsYXVidD8KKyAgICAgIG9rPTE7CisgIH0KKyAgaWYgKCFvaykKKyAgICByZXR1cm4gMDsKKworICBpZiAoIXBvaW50ZXJwKGV4PWV4aXRzW3N0YXJ0XSkpIHsKKyAgICBpZiAoZmlsZV9zaXplKHN0YXJ0KyIuYyIpPD0wKSAvLyBCZWltIGVyc3RlbiBBdXNnYW5nIGF1ZiBWQyB0ZXN0ZW4KKyAgICAgIHJldHVybiAwOyAvLyBLZWluZSBWaXJ0dWFsIENvbXBpbGVyIFJhZXVtZSByb3V0ZW4KKyAgICBleD0oe30pOworICB9CisgIGZvciAoaT1zaXplb2YocmljaHR1bmdlbiktMTtpPj0wO2ktLSkgeworICAgIHJpY2h0dW5nPXJpY2h0dW5nZW5baV07CisgICAgaWYgKCEoeD1kaXJlY3Rpb25zW3JpY2h0dW5nXSkpCisgICAgICB4PXJpY2h0dW5nOworICAKKyAgICBwb3M9bWVtYmVyKGV4LHgpOworICAgIGlmIChwb3M+PTAgJiYgcG9zKzE8c2l6ZW9mKGV4KSkgLy8gUmljaHR1bmcgc2Nob24gZWluZ2V0cmFnZW4/CisgICAgIGV4W3BvcysxXT16aWVsOyAvLyBXdXJkZSB1bWRlZmluaWVydAorICAgIGVsc2UKKyAgICAgIGV4Kz0oe3gsemllbH0pOyAvLyAoeyByaWNodHVuZywgemllbCB9KQorICB9CisgIGV4aXRzW3N0YXJ0XT1leDsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIExvdy1MZXZlbCBGaW5kUm91dGUgOi0pCittYXBwaW5nIGRvX2ZpbmRfcm91dGUoc3RyaW5nIHN0YXJ0LCBtYXBwaW5nIGlzX3RhcmdldCkgeworICBtYXBwaW5nIGVycmVpY2h0OworICBpbnQgaSxqLGs7CisgIG1peGVkICpuZXd4LCAqYWN0eCwgZXg7CisgIHN0cmluZyByb29tLCBkaXIsIHg7CisgIAorICBlcnJlaWNodD0oW3N0YXJ0OiIjI1NUQVJUIl0pOworICBuZXd4PSh7c3RhcnR9KTsKKyAgZm9yIChrPU1BWF9MRU47az49MDtrLS0pIHsKKyAgICBhY3R4PW5ld3g7IC8vIEluIGRpZXNlbSBTY2hyaXR0IGRpZSBuZXUgZXJyZWljaHRlbiBSYWV1bWUgcHJ1ZWZlbgorICAgIG5ld3g9KHt9KTsgLy8gTm9jaCBrZWluZSBSYWV1bWUgbmV1IGVycmVpY2h0CisgICAgZm9yIChpPXNpemVvZihhY3R4KS0xO2k+PTA7aS0tKSB7CisgICAgICByb29tPWFjdHhbaV07CisgICAgICAvLyBwcmludGYoIiVPXG4iLHJvb20pOworICAgICAgaWYgKCFwb2ludGVycChleD1leGl0c1tyb29tXSkpCisJY29udGludWU7CisgICAgICAvLyBwcmludGYoIi0+ICVPXG4iLGV4KTsKKyAgICAgIGZvciAoaj1zaXplb2YoZXgpLTE7aj49MTtqLT0yKSB7CisJeD1leFtqXTsgLy8gWmllbHJhdW0KKwkvLyBwcmludGYoIi0+ICVPXG4iLHgpOworCWlmICghZXJyZWljaHRbeF0pIHsgLy8gV3VyZGUgYmlzaGVyIG5vY2ggbmljaHQgZXJyZWljaHQKKwkgIGVycmVpY2h0W3hdPSh7cm9vbSxleFtqLTFdfSk7CisJICBpZiAoaXNfdGFyZ2V0W3hdKSB7IC8vIEVpbiBaaWVsIHd1cmRlIGVycmVpY2h0CisJICAgIGVycmVpY2h0WyIjI1pJRUwiXT1lcnJlaWNodFt4XTsgLy8gS2FubiBqYSBhdWNoIEdydXBwZSBzZWluCisJICAgIHJldHVybiBlcnJlaWNodDsKKwkgIH0KKwkgIG5ld3grPSh7eH0pOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgbWl4ZWQgRmluZFJvdXRlKHN0cmluZyBzdGFydCwgc3RyaW5nIHppZWwsIGludCBldHlwKSB7CisgIG1hcHBpbmcgcmVzLHppZWxlOworICBzdHJpbmcgeDsKKyAgbWl4ZWQgZXgscixyZXN1bHQ7CisgIGludCBrOworICAKKyAgaWYgKCFzdGFydCB8fCAhemllbCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFtYXBwaW5ncCh6aWVsZT10YXJnZXRzW3ppZWxdKSkKKyAgICB6aWVsZT0oW3ppZWw6MV0pOworICBpZiAoIW1hcHBpbmdwKHJlcz1kb19maW5kX3JvdXRlKHN0YXJ0LCB6aWVsZSkpKQorICAgIHJldHVybiAwOyAvLyBuaWNodCBnZWZ1bmRlbgorICBpZiAoZXR5cCkKKyAgICByZXN1bHQ9KHt9KTsKKyAgZWxzZQorICAgIHJlc3VsdD0oW10pOworICB4PSIjI1pJRUwiOworICBmb3IgKGs9TUFYX0xFTisyO2s+PTA7ay0tKSB7CisgICAgZXg9cmVzW3hdOworICAgIGlmIChleD09IiMjU1RBUlQiKSAvLyBGZXJ0aWcuCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmICghKHI9cmV2ZXJzZV9kaXJlY3Rpb25zW2V4WzFdXSkpIC8vIHJpY2h0aWdlIFJpY2h0dW5nZW4gZWludHJhZ2VuLgorICAgICAgcj1leFsxXTsKKyAgICB4PWV4WzBdOworICAgIGlmIChldHlwKQorICAgICAgcmVzdWx0PSh7cn0pK3Jlc3VsdDsKKyAgICBlbHNlCisgICAgICByZXN1bHRbeF09cjsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBzYXZlKCkgeworCXNhdmVfb2JqZWN0KERCX05BTUUpOworfQorCit2b2lkIHJlc2V0KCkgeworCXNldF9uZXh0X3Jlc2V0KDQzMjAwKTsgLy8gQWxsZSAxMiBTdHVuZGVuIHNwZWljaGVybiByZWljaHQKKwlzYXZlKCk7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi9ydWVzdHVuZ2VuLmMgYi9wL2RhZW1vbi9ydWVzdHVuZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwMjlmYgotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3J1ZXN0dW5nZW4uYwpAQCAtMCwwICsxLDU2IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgU0FWRUZJTEUgICIvcC9kYWVtb24vc2F2ZS9ydWVzdHVuZ2VuIgorI2RlZmluZSBEVU1QRklMRSAiL2xvZy9SVUVTVFVOR0VOIgorCittYXBwaW5nIGFybW91cnM7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisKKyAgICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSkKKyAgICB7CisgICAgICAgIGFybW91cnMgPSAoW10pOworICAgIH0KK30KKwordm9pZCBzYXZlX21lKCkKK3sKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKK3ZvaWQgUmVnaXN0ZXJBcm1vdXIoKQoreyAgIG9iamVjdCAgb2I7CisgICAgc3RyaW5nICBpZDsKKworICAgIGlmICghb2JqZWN0cChvYj1wcmV2aW91c19vYmplY3QoKSkgfHwgCisgICAgICBtZW1iZXIoaW5oZXJpdF9saXN0KG9iKSwiL3N0ZC9hcm1vdXIuYyIpPT0tMSkKKyAgICAgICAgcmV0dXJuOworICAgIGlkID0gb2xkX2V4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF07CisgICAgaWYgKG1lbWJlcihhcm1vdXJzLGlkKSkKKyAgICAgICAgcmV0dXJuOworICAgIGFybW91cnMgKz0gKFsgaWQgOiAxXSk7CisgICAgc2F2ZV9tZSgpOworfQorCitpbnQgRHVtcCgpCit7ICAgc3RyaW5nICAqaW5kOworICAgIGludCAgICAgaTsKKworICAgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFJU19MT1JEKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZmlsZV9zaXplKERVTVBGSUxFKT49MCkKKyAgICAgICAgcm0oRFVNUEZJTEUpOworCisgICAgaW5kID0gc29ydF9hcnJheShtX2luZGljZXMoYXJtb3VycyksIyc+KTsKKyAgICBpZiAoKGk9c2l6ZW9mKGluZCkpPDEpCisgICAgICAgIHJldHVybiAwOworICAgIHdyaXRlX2ZpbGUoRFVNUEZJTEUsc3ByaW50ZigiRHVtcGVkOiAlc1xuIixkdGltZSh0aW1lKCkpKSk7CisgICAgZm9yICgtLWk7aT49MDtpLS0pCisgICAgICB3cml0ZV9maWxlKERVTVBGSUxFLGluZFtpXSsiXG4iKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3Nhc3RhdGQuYyBiL3AvZGFlbW9uL3Nhc3RhdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDI4NzNlCi0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vc2FzdGF0ZC5jCkBAIC0wLDAgKzEsMTM1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL3AvZGFlbW9uL3Nhc3RhdGQuYworKiBTdGF0aXN0aWtkYWVtb24gZnVlciBTa2lsbC1BdHRyaWJ1dGUKKyogRGVyIERhZW1vbiBsb2dndCBTQS1Nb2RpZmllciB1bmQgc2NocmVpYnQgc2llIHZvbiBaZWl0IHp1IFplaXQgYXVmIGRpZQorKiBQbGF0dGUuCisqIFxhdXRob3IgWmVzc3RyYQorKiBcZGF0ZSAwNi4wOC4yMDA4CisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjaworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisvKiogYW5mYWVuZ2xpY2hlIEdyb2Vzc2UgZGVzIExvZy1QdWZmZXJzCisgICovCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX0xFTiAyMDAKKy8qKiBhYiBkaWVzZXIgQW56YWhsIGFuIEVpbnRyYWVnZW4gd2lyZCBpbSBuYWVjaHN0ZW4gQmFja2VuZC1aeWtsdXMgdm9tIERyaXZlcgorICogcGVyIENhbGxvdXQgZGVyIFB1ZmZlciB3ZWdnZXNjaHJpZWJlbi4gKi8KKyNkZWZpbmUgQlVGRkVSVEhSRVNIT0xEIDE1MAorCisvKiogTG9nZmlsZSBmdWVyIGRpZSBTdGF0cworICAqLworI2RlZmluZSBTVEFUTE9HICJTQVNUQVRTIgorLyoqIG1heC4gTG9nZmlsZWdyb2Vzc2UgKDMgTUIpCisgICovCisjZGVmaW5lIE1BWExPR1NJWkUgMzE0NTcyOAorCitzdHJ1Y3QgbG9nX2VudHJ5X3MgeworICBpbnQgdGltZXN0YW1wOworICBzdHJpbmcgbGl2OworICBzdHJpbmcgY2FzdGVyOworICBzdHJpbmcgYXRybmFtZTsKKyAgbWl4ZWQgdmFsdWU7CisgIGludCBkdXJhdGlvbjsKK307CisKK3N0cnVjdCBsb2dfYnVmZmVyX3MgeworICBtaXhlZCBidWY7ICAvLyBBcnJheSB2b24gbG9nX2VudHJ5CisgIGludCBidWZmZXJsZW47IC8vIExhZW5nZSBkZXMgQnVmZmVycywga2FubiBkeW4uIHZlcmdyb2Vzc2VydCB3ZXJkZW4uCisgIGludCBzcDsgLy8gb2JlcnN0ZXIgRWludHJhZyBpbSBCdWZmZXIgKGxldHp0ZW5kbGljaCBuZW4gU3RhY2spLgorfTsKKworLyoqIHNwZWljaGVydCBMb2dlaW50cmFlZ2UgbWl0IGluZGl2LiBNb2RpZmllcmVpbnRyYWVnZW4uCisgKiBBcnJheSB2b24gbG9nX2VudHJ5X3MgbWl0IEluZm8gdWViZXIgUHVmZmVybGFlbmdlIHVuZCB6dWxldHp0CisgKiBnZXNjaHJpZWJlbmVtIEFycmF5ZWludHJhZy4KKyovCitzdHJ1Y3QgbG9nX2J1ZmZlcl9zIGxvZ2J1ZiA9ICg8bG9nX2J1ZmZlcl9zPgorICAgIGJ1ZiA6IGFsbG9jYXRlKERFRkFVTFRfQlVGRkVSX0xFTiksCisgICAgYnVmZmVybGVuIDogREVGQVVMVF9CVUZGRVJfTEVOLAorICAgIC8vIC0xLCB3ZWlsIGRlciBzcCBiZWltIExvZ2dlbiB6dWVyc3QgZXJob2VodCB3aXJkIHVuZCBzb25zdCBFbGVtZW50ZSAwCisgICAgLy8gbGVlciBibGVpYnQuCisgICAgc3AgOiAtMSApOworCisvKiogXGRlZiBERUJVRworICBPdXRwdXRzIGRlYnVnIG1lc3NhZ2UgdG8gTWFpbnRhaW5lciwgaWYgTWFpbnRlaW5lciBpcyBsb2dnZWQgaW4uIAorKi8KKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRURCRzogIit4KyJcbiIpCisjZW5kaWYKKworcHJpdmF0ZSBzdHJpbmcgRm9ybWF0TG9nRW50cnkoc3RydWN0IGxvZ19lbnRyeV9zIGVudHJ5KSB7CisgIHJldHVybiBzcHJpbnRmKCJbJXNdICVzLCAlcywgJXMsICVzLCAlZFxuIiwgCisgICAgICBzdHJmdGltZSgiJWQlbSV5LSVIJU0lUyIsZW50cnktPnRpbWVzdGFtcCksCisgICAgICBlbnRyeS0+bGl2LCBlbnRyeS0+Y2FzdGVyLCBlbnRyeS0+YXRybmFtZSwKKyAgICAgIGVudHJ5LT52YWx1ZSwgZW50cnktPmR1cmF0aW9uKTsKK30KKworcHJpdmF0ZSB2b2lkIFdyaXRlQnVmZmVyKCkgeworICAvLyByZWxldmFudGVuIFRlaWwgZGVzIFB1ZmZlcnMgZXh0cmFoaWVyZW4uCisgIG1peGVkIGJ1ZiA9IGxvZ2J1Zi0+YnVmWzAuLmxvZ2J1Zi0+c3BdOworICAvLyBkYW5uIGFsbGUgRWludHJhZWdlIGluIFN0cmluZ3MgbWFwcGVuCisgIGJ1ZiA9IG1hcChidWYsICMnRm9ybWF0TG9nRW50cnkpOworICAvLyB3ZWdzY2hyZWliZW4KKyAgbG9nX2ZpbGUoU1RBVExPRywgc3ByaW50ZigiJUBzIixidWYpLCBNQVhMT0dTSVpFKTsKKyAgLy8gc3AgYXVmIGRlbiBQdWZmZXJhbmZhbmcgc2V0emVuCisgIGxvZ2J1Zi0+c3AgPSAtMTsKK30KKworcHVibGljIHZvaWQgTG9nTW9kaWZpZXIob2JqZWN0IGNhc3Rlciwgc3RyaW5nIGF0cm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlZCB2YWx1ZSwgaW50IGR1cmF0aW9uKSB7CisgIC8vIG51ciBTcGllbGVyIHNpbmQgaW50ZXJlc3NhbnQKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICByZXR1cm47CisKKyAgLy8gc3AgdW0gZWlucyBlcmhvZWhlbiB1bmQgc2NoYXVlbiwgb2IgZGllIFB1ZmZlcmdyb2Vzc2UgdWViZXJzY2hyaXR0ZW4KKyAgLy8gd3VyZGUuIFdlbm4gamEsIFB1ZmZlciB2ZXJncm9lc3Nlcm4uCisgIGxvZ2J1Zi0+c3ArKzsKKyAgaWYgKGxvZ2J1Zi0+c3AgPj0gbG9nYnVmLT5idWZmZXJsZW4pIHsKKyAgICBsb2didWYtPmJ1ZiA9IGxvZ2J1Zi0+YnVmICsgYWxsb2NhdGUoNTApOworICAgIGxvZ2J1Zi0+YnVmZmVybGVuICs9IDUwOworICB9CisgIC8vIGVpbnRyYWdlbi4gSW50ZXJlc3NhbnRlcndlaXNlIGlzdCBlcyB0YXRzYWVjaGxpY2gga2VpbiBQcm9ibGVtLCB3ZW5uCisgIC8vIFN0cnVjdG1lbWJlciB1bmQgbG9rYWxlIFZhcmlhYmxlbiBoaWVyIGRlbiBnbGVpY2hlbiBOYW1lbiBoYWJlbS4gOy0pCisgIGxvZ2J1Zi0+YnVmW2xvZ2J1Zi0+c3BdID0gKDxsb2dfZW50cnlfcz4KKyAgICAgIHRpbWVzdGFtcCA6IHRpbWUoKSwKKyAgICAgIGxpdiA6IGdldHVpZChwcmV2aW91c19vYmplY3QoKSksIC8vIG51ciBTcGllbGVyCisgICAgICBjYXN0ZXIgOiBvYmplY3RfbmFtZShjYXN0ZXIpLAorICAgICAgYXRybmFtZSA6IGF0cm5hbWUsCisgICAgICB2YWx1ZSA6IHRvX3N0cmluZyh2YWx1ZSksIC8vIHdlZ2VuIChmbHVlY2h0aWdlcikgQ2xvc3VyZXMKKyAgICAgIGR1cmF0aW9uIDogZHVyYXRpb24gKTsKKyAgLy8gd2Vnc2NocmVpYmVuIHZlcmFubGFzc2VuCisgIGlmIChsb2didWYtPnNwID4gQlVGRkVSVEhSRVNIT0xECisgICAgICAmJiBmaW5kX2NhbGxfb3V0KCMnV3JpdGVCdWZmZXIpID09IC0xKQorICAgIGNhbGxfb3V0KCMnV3JpdGVCdWZmZXIsIDApOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKE1FKSk7Cit9CisKK3ZhcmFyZ3MgcHVibGljIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICBpZiAobG9nYnVmLT5zcCA+IC0xKQorICAgIFdyaXRlQnVmZmVyKCk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIC8vIGdnZi4gUHVmZmVyIHdlZ3NjaHJlaWJlbi4KKyAgaWYgKGxvZ2J1Zi0+c3AgPiBCVUZGRVJUSFJFU0hPTEQpCisgICAgV3JpdGVCdWZmZXIoKTsKKyAgLy8gZ2dmLiBzZWhyIGdyb3NzZSBQdWZmZXIgdmVya2xlaW5lcm4KKyAgaWYgKGxvZ2J1Zi0+YnVmZmVybGVuID4gREVGQVVMVF9CVUZGRVJfTEVOICogMikgeworICAgIGxvZ2J1Zi0+YnVmID0gYWxsb2NhdGUoREVGQVVMVF9CVUZGRVJfTEVOKTsKKyAgICBsb2didWYtPmJ1ZmZlcmxlbiA9IERFRkFVTFRfQlVGRkVSX0xFTjsKKyAgICBsb2didWYtPnNwID0gLTE7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vc3ZuMm5ld3MuYyBiL3AvZGFlbW9uL3N2bjJuZXdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlY2U3OQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3N2bjJuZXdzLmMKQEAgLTAsMCArMSw1NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHN2bjJuZXdzLmMgLS0gU2V0enQgZGllIFN1YnZlcnNpb24tRWludHJhZWdlIGluIG1hZ2llci5tdWRsaWIKKy8vCisvLyAkSWQkCisKKy8vIEVyc3RlbGx0IGF1ZiBCYXNpcyB2b24gcmNzMm5ld3Mgdm9uIFpvb2suCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93CisKKyNpbmNsdWRlIDxkYWVtb24uaD4KKworI2RlZmluZSBORVdTRklMRSAiL3AvZGFlbW9uL3NhdmUvc3ZuMm5ld3MudHh0IgorI2RlZmluZSBORVdTRklMRU9MRCAiL3AvZGFlbW9uL3NhdmUvc3ZuMm5ld3Mub2xkIgorCisjZGVmaW5lIERFQlVHKHN0cikgaWYgKGZpbmRfcGxheWVyKCJ6b29rIikpICBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6b29rIiksIHNwcmludGYoInN2bjJuZXdzOiBERUJVRzogJU9cbiIsc3RyKSkKKworc3RhdGljIHZvaWQgY2hlY2tyY3MoKQoreworICBzdHJpbmcgc3RyOworICBtaXhlZCBhcnQ7CisgIC8vIExldHp0ZSBFaW50cmFnIHNvbGx0ZSBlaW4gd2VuaWcgaGVyIHNlaW4sIGRhbWl0IGVzIGtlaW5lCisgIC8vIFVlYmVyc2NobmVpZHVuZ2VuIGdpYnQuCisgIGlmIChmaWxlX3RpbWUoTkVXU0ZJTEUpKzE4MDAgPiB0aW1lKCkpIHJldHVybjsKKyAgaWYgKCEoc3RyPXJlYWRfZmlsZShORVdTRklMRSwwLDEwMDAwKSkgfHwgKHN0cj09IiIpKSByZXR1cm47CisgIGFydD0oeyJtYWdpZXIubXVkbGliIiwiU1ZOMk5FV1MiLDAsMCwKKyAgICAgICAgIlNWTi1FaW50cmFlZ2Ugdm9tICIrZHRpbWUodGltZSgpKSxzdHJ9KTsKKyAgaWYgKCgiL3NlY3VyZS9uZXdzIi0+V3JpdGVOb3RlKGFydCwxKT49MSkgfHwKKyAgICAgICgoIi9zZWN1cmUvbmV3cyItPlJlbW92ZU5vdGUoIm1hZ2llci5tdWRsaWIiLDApPj0xKSAmJgorICAgICAgICgiL3NlY3VyZS9uZXdzIi0+V3JpdGVOb3RlKGFydCwxKT49MSkpKQorICAgIGNhdGNoKHJlbmFtZShORVdTRklMRSxORVdTRklMRU9MRCk7cHVibGlzaCk7CisgIGVsc2UgbG9nX2ZpbGUoIlNWTjJORVdTIixkdGltZSh0aW1lKCkpKworCQkiIDogS2FubiBSQ1MtRWludHJhZWdlIG5pY2h0IG5hY2ggbWFnaWVyLm11ZGxpYiBwb3N0ZW4hXG4iKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIC8vIGNhbGxfb3V0KCkgbm9ldGlnLCBkYSBzb25zdCBrZWluIHdlaXRlcmVzIHJlc2V0KCkgZ2VydWZlbiB3aXJkCisgIC8vIHJlc2V0KCkgd2lyZCBudXIgZ2VydWZlbiBiZWkgZWluZW0gY2FsbCBlaW5lciBhbmRlcmVuIEZ1bmt0aW9uCisgIC8vIG5hY2ggZWluZW0gUmVzZXQKKyAgY2FsbF9vdXQoImNoZWNrcmNzIiwxKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgcmVzZXQoKTsKK30KKwordm9pZCBjbGVhbl91cChpbnQgcmVmYykKK3sKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi90ZWFtbWFzdGVyLmMgYi9wL2RhZW1vbi90ZWFtbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlOGNhMAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3RlYW1tYXN0ZXIuYwpAQCAtMCwwICsxLDg0IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdyxub19jbG9uZQorCisjaW5jbHVkZSA8bGl2aW5nL3RlYW0uaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2RlZmluZSBQTyBwcmV2aW91c19vYmplY3QoKQorCitzdGF0aWMgbWFwcGluZyB0ZWFtX25hbWVzOworc3RhdGljIG1hcHBpbmcgdGVhbV9uYW1lc19yZXZlcnNlOworCit2b2lkIGNyZWF0ZSgpIHsKKworICB0ZWFtX25hbWVzPShbXSk7ICAgICAgICAgLy8gT2JqZWt0IC0+IE5hbWUKKyAgdGVhbV9uYW1lc19yZXZlcnNlPShbXSk7IC8vIE5hbWUgLT4gT2JqZWt0Cit9CisKK3N0YXRpYyBtaXhlZCBEb1JlZ2lzdGVyVGVhbShvYmplY3Qgb2IsIHN0cmluZyBuYW1lKSB7CisgIG1peGVkIG9sZDsKKworICBvbGQ9dGVhbV9uYW1lc1tvYl07CisgIG1fZGVsZXRlKHRlYW1fbmFtZXNfcmV2ZXJzZSxvbGQpOyAvLyBOYW1lbiBGcmVpZ2ViZW4KKyAgaWYgKCFuYW1lKSB7IC8vIFVuUmVnaXN0ZXIKKyAgICBtX2RlbGV0ZSh0ZWFtX25hbWVzLG9iKTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorICB0ZWFtX25hbWVzW29iXT1uYW1lOworICB0ZWFtX25hbWVzX3JldmVyc2VbbmFtZV09b2I7CisgIHJldHVybiBuYW1lOworfQorCit2YXJhcmdzIHN0cmluZyBSZWdpc3RlclRlYW0oc3RyaW5nIG5hbWUpIHsKKyAgaW50IGksbWluOworCisgIGlmIChtZW1iZXIoaW5oZXJpdF9saXN0KFBPKSxURUFNX09CSkVDVCsiLmMiKTwwKQorICAgIHJldHVybiAwOworICBpZiAoc3RyaW5ncChuYW1lKSl7CisgICAgaWYgKCF0ZWFtX25hbWVzX3JldmVyc2VbbmFtZV0pIC8vIE5hbWUgbm9jaCBuaWNodCB2ZXJnZWJlbgorICAgICAgcmV0dXJuIERvUmVnaXN0ZXJUZWFtKFBPLG5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIG1pbj1zaXplb2YobV9pbmRpY2VzKHRlYW1fbmFtZXNfcmV2ZXJzZSkpKzI7CisgIGZvciAoaT0xO2k8bWluO2krKykKKyAgICBpZiAoIXRlYW1fbmFtZXNfcmV2ZXJzZVtzcHJpbnRmKCIlZCIsaSldKSB7CisgICAgICBtaW49aTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgbmFtZT1zcHJpbnRmKCIlZCIsaSk7CisgIHJldHVybiBEb1JlZ2lzdGVyVGVhbShQTyxuYW1lKTsKK30KKwordm9pZCBVbnJlZ2lzdGVyVGVhbSgpIHsKKyAgaWYgKG1lbWJlcihpbmhlcml0X2xpc3QoUE8pLFRFQU1fT0JKRUNUKyIuYyIpPj0wKQorICAgIERvUmVnaXN0ZXJUZWFtKFBPLDApOworfQorCitvYmplY3QgKkxpc3RUZWFtT2JqZWN0cygpIHsKKyAgcmV0dXJuKG1faW5kaWNlcyh0ZWFtX25hbWVzKS0oezB9KSk7Cit9CisKK3N0cmluZyAqTGlzdFRlYW1OYW1lcygpIHsKKyAgcmV0dXJuKG1faW5kaWNlcyh0ZWFtX25hbWVzX3JldmVyc2UpLSh7MH0pKTsKK30KKworc3RyaW5nICpTb3J0ZWRMaXN0VGVhbU5hbWVzKCkgeworICByZXR1cm4oc29ydF9hcnJheShMaXN0VGVhbU5hbWVzKCksIyc8KSk7Cit9CisKK3ZvaWQgU2hvd1RlYW1JbmZvcygpIHsKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgKmluZDsKKyAgaW50IGk7CisgIAorICB3cml0ZSgiIC0tLSBUZWFtbGlzdGU6IC0tLVxuIik7CisgIGluZD1Tb3J0ZWRMaXN0VGVhbU5hbWVzKCk7CisgIGZvciAoaT1zaXplb2YoaW5kKS0xO2k+PTA7aS0tKQorICAgIGlmIChvYmplY3RwKG9iPXRlYW1fbmFtZXNfcmV2ZXJzZVtpbmRbaV1dKSkKKyAgICAgIG9iLT5TaG93VGVhbUluZm8oKTsKKyAgd3JpdGUoIiAtLS0gKEVuZGUgVGVhbWxpc3RlKSAtLS1cbiIpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3RtcF9wcm9wX21hc3Rlci5jIGIvcC9kYWVtb24vdG1wX3Byb3BfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMWRlNwotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3RtcF9wcm9wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzM4IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCisjZGVmaW5lIFNBVkVGSUxFICIvcC9kYWVtb24vc2F2ZS90bXBfcHJvcF9tYXN0ZXIiCisjZGVmaW5lIFBST1BNQVNURVIgIi9wL2RhZW1vbi90bXBfcHJvcF9tYXN0ZXIiCisjZGVmaW5lIElOREVYKGEsYikgKG9iamVjdF9uYW1lKGEpKyIjIyIrYikKKworCisjaWZkZWYgREVCVUcKKyMgICB1bmRlZiBERUJVRworI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyAgIGRlZmluZSBEQkcoeCkgaWYgKCBmaW5kX3BsYXllcigicmlrdXMiKSApIFwKKyAgICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcigicmlrdXMiKSwgeCApOworI2Vsc2UKKyMgICBkZWZpbmUgREJHKHgpCisjZW5kaWYKKworCittaXhlZCAqcmVzZXRfdGltZXM7CittYXBwaW5nIGluX3Byb2dyZXNzOworCisKK3ZhcmFyZ3MgcHVibGljIGludCByZW1vdmUoIGludCBzaWxlbnQgKTsKK3B1YmxpYyB2b2lkIHJlc2V0KCk7CitwdWJsaWMgdm9pZCBwcmludF9kZWJ1Z19pbmZvKCk7CitzdGF0aWMgdm9pZCBjYWxsX25leHRfdXBkYXRlKCk7CitzdGF0aWMgdm9pZCBkb191cGRhdGUoKTsKK3B1YmxpYyBpbnQgSXNUbXBQcm9wKCBvYmplY3Qgb2IsIHN0cmluZyBwcm9wICk7CitwdWJsaWMgdm9pZCBSZW1vdmVUbXBQcm9wKCBzdHJpbmcgcHJvcCApOwordmFyYXJncyBwdWJsaWMgdm9pZCBTZXRUbXBQcm9wKCBvYmplY3Qgb2IsIHN0cmluZyBwcm9wLCBtaXhlZCBuZXd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0bSwgaW50IHNwICk7CisKKworcHVibGljIHZvaWQgY3JlYXRlKCkKK3sKKworICAgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgICAKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdChTQVZFRklMRSkgKXsKKyAgICAgICAgaW5fcHJvZ3Jlc3MgPSAoW10pOworICAgICAgICByZXNldF90aW1lcyA9ICh7fSk7CisgICAgfQorCisgICAgY2FsbF9uZXh0X3VwZGF0ZSgpOworfQorCisKK3ZhcmFyZ3MgcHVibGljIGludCByZW1vdmUoIGludCBzaWxlbnQgKQoreworICAgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgdm9pZCByZXNldCgpCit7CisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCisKK3B1YmxpYyB2b2lkIHByaW50X2RlYnVnX2luZm8oKQoreworICAgIHByaW50ZiggImluX3Byb2dyZXNzOiAlT1xucmVzZXRfdGltZXM6ICVPXG4iLCBpbl9wcm9ncmVzcywgcmVzZXRfdGltZXMgKTsKK30KKworCitzdGF0aWMgdm9pZCBjYWxsX25leHRfdXBkYXRlKCkKK3sKKyAgICBpbnQgZHQ7CisgICAgCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoImRvX3VwZGF0ZSIpICE9IC0xICkKKyAgICAgICAgOworICAgIAorICAgIGlmICggc2l6ZW9mKHJlc2V0X3RpbWVzKSApeworICAgICAgICBkdCA9IHJlc2V0X3RpbWVzWzBdWzBdIC0gdGltZSgpOworCisgICAgICAgIGlmICggZHQgPD0gMCApCisgICAgICAgICAgICBkdCA9IDU7CisgICAgICAgIAorICAgICAgICBjYWxsX291dCggImRvX3VwZGF0ZSIsIGR0ICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGRvX3VwZGF0ZSgpCit7CisgICAgaW50IGksIG1heDsKKyAgICBzdHJpbmcgaW5kZXg7CisgICAgbWl4ZWQgKnZhbDsKKworICAgIERCRyggImRvX3VwZGF0ZSgpIGF1ZmdlcnVmZW4hXG4iICk7CisKKyAgICB3aGlsZSAoIHJlbW92ZV9jYWxsX291dCgiZG9fdXBkYXRlIikgIT0gLTEgKQorICAgICAgICA7CisgICAgCisgICAgY2FsbF9vdXQoICJkb191cGRhdGUiLCAzMCApOyAvLyBadXIgU2ljaGVyaGVpdC4uLgorCisgICAgaWYgKCAhKG1heCA9IHNpemVvZihyZXNldF90aW1lcykpICkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGZvciAoIGkgPSAwOyBpIDwgbWF4ICYmIHJlc2V0X3RpbWVzW2ldWzBdIDw9IHRpbWUoKTsgaSsrICl7CisgICAgICAgIGluZGV4ID0gcmVzZXRfdGltZXNbaV1bMV07CisKKyAgICAgICAgaWYgKCAhcG9pbnRlcnAodmFsID0gaW5fcHJvZ3Jlc3NbaW5kZXhdKSB8fCAhb2JqZWN0cCh2YWxbMF0pICkKKwl7CisgICAgICAgICAgICBtX2RlbGV0ZSggaW5fcHJvZ3Jlc3MgLGluZGV4ICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIERCRyggc3ByaW50ZigiRW50ZmVybmUgRWludHJhZyAlTyFcbiIsIGluZGV4KSApOworCisgICAgICAgIGlmICggdmFsWzRdICl7CisgICAgICAgICAgICBpZiAoIHZhbFswXS0+UXVlcnkodmFsWzFdLCBGX1ZBTFVFKSA9PSB2YWxbM10gKXsKKyAgICAgICAgICAgICAgICBEQkcoICJBbHRlIFByb3BlcnR5IHBlciBTZXRQcm9wKCkgcmVzdGF1cmllcnQhXG4iICk7CisgICAgICAgICAgICAgICAgdmFsWzBdLT5TZXRQcm9wKCB2YWxbMV0sIHZhbFsyXSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCB2YWxbMF0tPlF1ZXJ5KCB2YWxbMV0sIEZfUVVFUllfTUVUSE9EICkgPT0gdmFsWzJdICl7CisgICAgICAgICAgICAgICAgdmFsWzBdLT5TZXQoIHZhbFsxXSwgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgICAgICAgICAgICAgICBEQkcoICJGX1FVRVJZX01FVEhPRCBlbnRmZXJudCFcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCB2YWxbMF0tPlF1ZXJ5KCB2YWxbMV0sIEZfU0VUX01FVEhPRCApID09IHZhbFszXSApeworICAgICAgICAgICAgICAgIHZhbFswXS0+U2V0KCB2YWxbMV0sIDAsIEZfU0VUX01FVEhPRCApOworICAgICAgICAgICAgICAgIERCRyggIkZfU0VUX01FVEhPRCBlbnRmZXJudCFcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1fZGVsZXRlKCBpbl9wcm9ncmVzcyAsaW5kZXggKTsKKyAgICB9CisgICAgCisgICAgcmVzZXRfdGltZXMgPSByZXNldF90aW1lc1tpLi5dOworICAgIGNhbGxfbmV4dF91cGRhdGUoKTsKK30KKworCisvLyBadXIgQWJmcmFnZSwgb2IgZWluZSB0ZW1wb3JhZXJlIFByb3BlcnR5IHNjaG9uIGdlc2V0enQgaXN0CitwdWJsaWMgaW50IElzVG1wUHJvcCggb2JqZWN0IG9iLCBzdHJpbmcgcHJvcCApCit7CisgICAgbWl4ZWQgb2xkdmFsOworCisgICAgaWYgKCAhb2JqZWN0cChvYikgfHwgIXByb3AgKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBpZiAoIChvbGR2YWwgPSBpbl9wcm9ncmVzc1tJTkRFWChvYiwgcHJvcCldKQorICAgICAgICAgJiYgb2IgPT0gb2xkdmFsWzBdICYmIHByb3AgPT0gb2xkdmFsWzFdICkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKworLy8gRW50ZmVybmVuIGVpbmVyIHRlbXBvcmFlcmVuIFByb3BlcnR5LgorLy8gSXN0IG5pY2h0IHp1bSBFbnRmZXJuZW4gcGVyIEhhbmQgZ2VkYWNodCwgc29uZGVybiBrYW5uIG51ciB2b20gT2JqZWt0IHNlbGJlcgorLy8gYXVmZ2VydWZlbiB3ZXJkZW4uIEdlc2NoaWVodCwgd2VubiBiZWkgZ2VzZXR6dGVyIHRlbXBvcmFlcmVyIEZfU0VUX01FVEhPRAorLy8gZWluIGZyZW1kZXMgU2V0UHJvcCgpIGF1ZiBkaWUgUHJvcGVydHkga29tbXQuCitwdWJsaWMgdm9pZCBSZW1vdmVUbXBQcm9wKCBzdHJpbmcgcHJvcCApCit7CisgICAgc3RyaW5nIGluZGV4OworICAgIG1peGVkICp2YWw7CisgICAgaW50IGk7CisgICAgCisgICAgREJHKCAiUmVtb3ZlVG1wUHJvcCFcbiIpOworICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpIHx8ICFzdHJpbmdwKHByb3ApIHx8ICFzaXplb2YocHJvcCkgKQorICAgICAgICByZXR1cm47CisKKyAgICBpbmRleCA9IElOREVYKHByZXZpb3VzX29iamVjdCgpLCBwcm9wKTsKKyAgICBEQkcoIHNwcmludGYoIlJlbW92ZVRtcFByb3AoJU8pIVxuIiwgaW5kZXgpICk7CisKKyAgICBpZiAoICEodmFsID0gaW5fcHJvZ3Jlc3NbaW5kZXhdKSApeworICAgICAgICBEQkcoICJLZWluIEVpbnRyYWcgdm9yaGFuZGVuIVxuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBvYmplY3RwKHZhbFswXSkgKXsKKyAgICAgICAgREJHKCAiUmVzdGF1cmllcmUgYWx0ZW4gWnVzdGFuZCAuLi5cbiIgKTsKKworICAgICAgICBpZiAoIHZhbFs0XSApeworICAgICAgICAgICAgaWYgKCB2YWxbMF0tPlF1ZXJ5KHZhbFsxXSwgRl9WQUxVRSkgPT0gdmFsWzNdICl7CisgICAgICAgICAgICAgICAgREJHKCAiQWx0ZSBQcm9wZXJ0eSBwZXIgU2V0UHJvcCgpIHJlc3RhdXJpZXJ0IVxuIiApOworICAgICAgICAgICAgICAgIHZhbFswXS0+U2V0UHJvcCggdmFsWzFdLCB2YWxbMl0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggdmFsWzBdLT5RdWVyeSggdmFsWzFdLCBGX1FVRVJZX01FVEhPRCApID09IHZhbFsyXSApeworICAgICAgICAgICAgICAgIHZhbFswXS0+U2V0KCB2YWxbMV0sIDAsIEZfUVVFUllfTUVUSE9EICk7CisgICAgICAgICAgICAgICAgREJHKCAiRl9RVUVSWV9NRVRIT0QgZW50ZmVybnQhXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggdmFsWzBdLT5RdWVyeSggdmFsWzFdLCBGX1NFVF9NRVRIT0QgKSA9PSB2YWxbM10gKXsKKyAgICAgICAgICAgICAgICB2YWxbMF0tPlNldCggdmFsWzFdLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgICAgICAgICAgICAgICBEQkcoICJGX1NFVF9NRVRIT0QgZW50ZmVybnQhXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHJlc2V0X3RpbWVzKTsgaS0tOyApCisgICAgICAgIGlmICggcmVzZXRfdGltZXNbaV1bMV0gPT0gaW5kZXggKXsKKyAgICAgICAgICAgIHJlc2V0X3RpbWVzW2kuLmldID0gKHt9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgCisgICAgREJHKCAiRWludHJhZyBlbnRmZXJudCFcbiIgKTsKKyAgICBtX2RlbGV0ZSggaW5fcHJvZ3Jlc3MsIGluZGV4ICk7Cit9CisKKworLy8gUHJvcGVydHkgJ3Byb3AnIGltIE9iamVrdCAnb2InIGZ1ZXIgJ3RtJyBTZWt1bmRlbiBhdWYgV2VydCAnbmV3dmFsJyBzZXR6ZW4uCisvLyBXZW5uIGRlciBTY2hhbHRlciAnc3AnIGdlc2V0enQgaXN0LCB3aXJkIGRhZnVlciBTZXRQcm9wKCkgdmVyd2VuZGV0LAorLy8gYW5zdGF0dCBlaW5lIEZfUVVFUllfTUVUSE9EIHp1IGJlbnV0emVuLgorLy8KKy8vIEFDSFRVTkc6CisvLworLy8gRGFzIFNldHplbiB2b24gJ3NwJyBpc3QgaG9lY2hzdCBmZWhsZXJhbmZhZWxsaWcgdW5kIHNvbGx0ZSBudXIgaW4gd2VuaWdlbgorLy8gU3BlemlhbGZhZWxsZW4gZ2VzY2hlaGVuLCBpbiBkZW5lbiBlaW5lIFNFVC1NZXRob2RlIGF1ZmdlcnVmZW4gd2VyZGVuIG11c3MKKy8vICh3aWUgYmVpIFBfTElHSFQgei5CLikuIEFuc29uc3RlbiBiaXR0ZSBkZW4gRGVmYXVsdC1BdWZydWYgb2huZSAnc3AnCisvLyB2ZXJ3ZW5kZW4hCisvLyAKKy8vIEVzIGJlc3RlaHQgc29uc3QgZGllIEdlZmFociwgZGFzcyBkaWUgUHJvcGVydHkgbmljaHQga29ycmVrdCB6dXJ1ZWNrZ2VzZXR6dAorLy8gd2lyZCAod2VubiBkaWVzZXIgTWFzdGVyIG9kZXIgJ29iJyB6ZXJzdG9lcnQgd2lyZCAtIG9kZXIgYmVpZGVzIHdpZSBiZWkgZWluZW0KKy8vIENyYXNoKSBvZGVyIGRhc3MgZHVyY2ggV2VjaHNlbHdpcmt1bmdlbiBtaXQgYW5kZXJlbiBRdWVyeS0gb2RlciBTZXQtTWV0aG9kZW4KKy8vIGVpbiBmYWxzY2hlciBXZXJ0ICJyZXN0YXVyaWVydCIgd2lyZC4KKwordmFyYXJncyBwdWJsaWMgdm9pZCBTZXRUbXBQcm9wKCBvYmplY3Qgb2IsIHN0cmluZyBwcm9wLCBtaXhlZCBuZXd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0bSwgaW50IHNwICkKK3sKKyAgICBzdHJpbmcgaW5kZXg7CisgICAgbWl4ZWQgb2xkdmFsLCB0bXA7CisgICAgaW50IG1heCwgcG9zLCBsLCByOworICAgIGNsb3N1cmUgYSwgYjsKKworICAgIGlmICggIW9iamVjdHAob2IpIHx8ICFzdHJpbmdwKHByb3ApIHx8ICFzaXplb2YocHJvcCkgfHwgdG0gPD0gMCApCisgICAgICAgIHJldHVybjsKKworICAgIGluZGV4ID0gSU5ERVgob2IsIHByb3ApOworICAgIERCRyggc3ByaW50ZigiU2V0VG1wUHJvcCggJU8sICVPLCAlTywgJU8sICVPICkhXG4iLCBvYiwgcHJvcCwgbmV3dmFsLAorICAgICAgICAgICAgICAgICB0bSwgc3ApICk7CisKKyAgICAvLyB3ZW5uIGJlcmVpdHMgZWluIHRlbXBvcmFlcmVyIFByb3plc3MgbGFldWZ0LCBkaWVzZW4gbnVuIGJlZW5kZW4hCisgICAgaWYgKCAob2xkdmFsID0gaW5fcHJvZ3Jlc3NbaW5kZXhdKQorICAgICAgICAgJiYgb2IgPT0gb2xkdmFsWzBdICYmIHByb3AgPT0gb2xkdmFsWzFdICl7CisgICAgICAgIERCRyggIkVzIGxhZXVmdCBiZXJlaXRzIGVpbiBWb3JnYW5nIGZ1ZXIgZGllc2UgUHJvcGVydHkhXG4iICk7CisgICAgICAgIAorICAgICAgICAvLyBXdXJkZSBkaWUgYWx0ZSB0ZW1wb3JhZXJlIFByb3BlcnR5IHBlciBTZXRQcm9wKCkgZ2VzZXR6dCwgbXVzcyBkZXIKKyAgICAgICAgLy8gdXJzcHJ1ZW5nbGljaGUgV2VydCBlcnN0IHJlc3RhdXJpZXJ0IHdlcmRlbi4gCisgICAgICAgIGlmICggb2xkdmFsWzRdICl7CisgICAgICAgICAgICBpZiAoIG9sZHZhbFswXS0+UXVlcnkob2xkdmFsWzFdLCBGX1ZBTFVFKSA9PSBvbGR2YWxbM10gKXsKKyAgICAgICAgICAgIERCRyggIkFsdGUgUHJvcGVydHkgcGVyIFNldFByb3AoKSByZXN0YXVyaWVydCFcbiIgKTsKKyAgICAgICAgICAgIG9sZHZhbFswXS0+U2V0UHJvcCggb2xkdmFsWzFdLCBvbGR2YWxbMl0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBbnNvbnN0ZW4gZWluZmFjaCBkaWUgRl9RVUVSWS0gdW5kIEZfU0VUX01FVEhPRCBsb2VzY2hlbi4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIG9sZHZhbFswXS0+UXVlcnkoIG9sZHZhbFsxXSwgRl9RVUVSWV9NRVRIT0QgKSA9PSBvbGR2YWxbMl0gKXsKKyAgICAgICAgICAgICAgICBvbGR2YWxbMF0tPlNldCggb2xkdmFsWzFdLCAwLCBGX1FVRVJZX01FVEhPRCApOworICAgICAgICAgICAgICAgIERCRyggIkZfUVVFUllfTUVUSE9EIGVudGZlcm50IVxuIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIG9sZHZhbFswXS0+UXVlcnkoIG9sZHZhbFsxXSwgRl9TRVRfTUVUSE9EICkgPT0gb2xkdmFsWzNdICl7CisgICAgICAgICAgICAgICAgb2xkdmFsWzBdLT5TZXQoIG9sZHZhbFsxXSwgMCwgRl9TRVRfTUVUSE9EICk7CisgICAgICAgICAgICAgICAgREJHKCAiRl9TRVRfTUVUSE9EIGVudGZlcm50IVxuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKCBsID0gc2l6ZW9mKHJlc2V0X3RpbWVzKTsgbC0tOyApCisgICAgICAgICAgICBpZiAoIHJlc2V0X3RpbWVzW2xdWzFdID09IGluZGV4ICl7CisgICAgICAgICAgICAgICAgcmVzZXRfdGltZXNbbC4ubF0gPSAoe30pOworICAgICAgICAgICAgICAgIERCRyggIlRpbWVyLUVpbnRyYWcgZW50ZmVybnQhXG4iICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB0bSA8IDEwMDAwMDAgKQorICAgICAgICB0bSArPSB0aW1lKCk7CisKKyAgICBpZiAoIHRtIDwgdGltZSgpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhc3AgKXsKKyAgICAgICAgLy8gRGVmYXVsdDogRl9RVUVSWV9NRVRIT0Qgc2V0emVuCisgICAgICAgIG9sZHZhbCA9IG9iLT5TZXQoIHByb3AsIG5ld3ZhbCwgIEZfUVVFUllfTUVUSE9EICk7CisKKyAgICAgICAgLy8gRl9TRVRfTUVUSE9ELCBkYW1pdCBkaWUgdGVtcG9yYWVyZSBQcm9wZXJ0eSBrZWluZW4gendpc2NoZW56ZWl0bGljaAorICAgICAgICAvLyBnZXNldHp0ZW4gYW5kZXJlbiBXZXJ0IHdpZWRlciAicmVzdGF1cmllcnQiLgorCisgICAgICAgIGE9c3ltYm9sX2Z1bmN0aW9uKCJSZW1vdmVUbXBQcm9wIix0aGlzX29iamVjdCgpKTsKKyAgICAgICAgYj1zeW1ib2xfZnVuY3Rpb24oIlNldFByb3AiLG9iKTsKKyAgICAgICAgdG1wPW9iLT5TZXQocHJvcCxsYW1iZGEoKHsnc2V0X3ZhbHVlLCdwcm9wX25hbWV9KSwoeyMnLCwoe2EsJ3Byb3BfbmFtZX0pLCh7IydyZXR1cm4sKHtiLCdwcm9wX25hbWUsJ3NldF92YWx1ZX0pfSl9KSksRl9TRVRfTUVUSE9EKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLy8gRnVlciBTcGV6aWFsZmFlbGxlIChQX0xJR0hUIHouQi4pIHdpcmQgZGllIFByb3BlcnR5IGRpcmVrdCBtaXQKKyAgICAgICAgLy8gU2V0UHJvcCgpIGdlc2V0enQgdW5kIHNwYWV0ZXIgbWl0IGRlbSBhbHRlbiBXZXJ0IHJlc3RhdXJpZXJ0LgorICAgICAgICAvLyBBY2h0dW5nIC0gZXh0cmVtIGZlaGxlcmFuZmFlbGxpZyB1bmQgd2lya2xpY2ggbnVyIGZ1ZXIgU3BlemlhbGZhZWxsZSEKKworICAgICAgICAvLyBBbHRlbiBXZXJ0IG1pdCBRdWVyeSgpIHNpY2hlcm4gYW5zdGF0dCBtaXQgUXVlcnlQcm9wKCksIHVtIG5pY2h0CisgICAgICAgIC8vIGlyZ2VuZHdlbGNoZW4gRl9RVUVSWV9NRVRIT0RzIGF1ZiBkZW4gTGVpbSB6dSBnZWhlbi4KKyAgICAgICAgb2xkdmFsID0gb2ItPlF1ZXJ5KCBwcm9wLCBGX1ZBTFVFICk7CisKKyAgICAgICAgLy8gUnVlY2tnYWJld2VydCBkZXMgU2V0UHJvcCgpIHNwZWljaGVybiwgdW0gc3BhZXRlciBlcmtlbm5lbiB6dQorICAgICAgICAvLyBrb2VubmVuLCBvYiBkaWUgUHJvcGVydHkgendpc2NoZW56ZWl0bGljaCB2ZXJhZW5kZXJ0IHd1cmRlLgorICAgICAgICB0bXAgPSBvYi0+U2V0UHJvcCggcHJvcCwgbmV3dmFsICk7CisgICAgfQorCisgICAgaW5fcHJvZ3Jlc3NbaW5kZXhdID0gKHsgb2IsIHByb3AsIG9sZHZhbCwgdG1wLCBzcCB9KTsKKyAgICAKKyAgICBpZiAoICEobWF4ID0gc2l6ZW9mKHJlc2V0X3RpbWVzKSkgKQorICAgICAgICBwb3MgPSAwOworICAgIGVsc2V7CisgICAgICAgIGwgPSAwOworICAgICAgICByID0gbWF4IC0gMTsKKyAgICAgICAgCisgICAgICAgIHdoaWxlICggbCA8IHIgKXsKKyAgICAgICAgICAgIHBvcyA9IChsICsgcikgLyAyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHRtIDwgcmVzZXRfdGltZXNbcG9zXVswXSApCisgICAgICAgICAgICAgICAgciA9IC0tcG9zOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGwgPSArK3BvczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKCBwb3MgPj0gMCAmJiBwb3MgPCBtYXggJiYgdG0gPCByZXNldF90aW1lc1twb3NdWzBdICkKKyAgICAgICAgICAgIHBvcy0tOworICAgIH0KKyAgICAKKyAgICByZXNldF90aW1lcyA9IHJlc2V0X3RpbWVzWzAuLnBvc10gKyAoeyAoe3RtLCBpbmRleH0pIH0pCisgICAgICAgICsgcmVzZXRfdGltZXNbcG9zKzEuLl07CisKKyAgICBEQkcoIHNwcmludGYoIlByb3BlcnR5IGFuIFN0ZWxsZSAlTyBlaW5nZWZ1ZWd0IVxuIiwgcG9zKzEpICk7CisKKyAgICBjYWxsX25leHRfdXBkYXRlKCk7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi90cmF2ZWxkLmMgYi9wL2RhZW1vbi90cmF2ZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZmQzOAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3RyYXZlbGQuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoqIERva3U6CitwdWJsaWMgaW50IEFkZFJvdXRlKHN0cmluZyB0cmFuc3BvcnRlciwgc3RyaW5nKiBsX3N0b3BzKQorICBCZXNjaHJlaWJ1bmc6CisgICAgU2V0enQgZGllIGFrdHVlbGxlIFJvdXRlIGVpbmVzIFRyYW5zcG9ydGVycy4KKyAgICBEaWUgUm91dGUgaGllciBpc3QgYWxsZXJkaW5ncyBudXIgZGllIExpc3RlIHZvbiBIYWx0ZXB1bmt0ZW4gLSBuaWNodCBkZXIKKyAgICBSZXN0LCBkZXIgaW4gZGVuIFJvdXRlbiBpbiBkZW4gVHJhbnNwb3J0ZXIgYWJnZWxlZ3QgaXN0LgorICAgIEVpbmUgbmV1ZSBSb3V0ZSBlcnNldHp0IGltbWVyIGRpZSBiaXNoZXJpZ2UgUm91dGUKKyAgICBXaXJkIHZvbiAvc3RkL3RyYW5zcG9ydCBnZXJ1ZmVuLCB3ZW5uIFBfTk9fVFJBVkVMSU5HIG5pY2h0IGdlc2V0enQgaXN0LgorICBSdWVja2dhYmV3ZXJ0ZToKKyAgICAtIDE6IFRyYW5zcG9ydGVyIHVuZCBIYWx0ZXB1bmt0IEVpbmdldHJhZ2VuLgorICAgIC0gMDogVHJhbnNwb3J0ZXIgb2RlciBIYWx0ZXB1bmt0IGtlaW4gc3RyaW5nfHN0cmluZyouCisgICAgLSAtMTogRXMgd3VyZGUgdmVyc3VjaHQgZWluZW4gVHJhbnNwb3J0ZXIgaW4gL3AvIG9kZXIgL3BsYXllcnMvCisgICAgICAgICAgZWluenV0cmFnZW4gCisgICAgICAgICAgdW5kIGRlciBFaW50cmFnZW5kZSBpc3Qga2VpbiBFTS4KKworcHVibGljIGludCBSZW1vdmVUcmFuc3BvcnRlcihzdHJpbmd8b2JqZWN0IHRyYW5zcG9ydGVyKQorcHVibGljIGludCBSZW1vdmVTdG9wKHN0cmluZ3xvYmplY3Qgc3RvcCkKKyAgQmVzY2hyZWlidW5nOgorICAgIEVudGZlcm50IGVpbmVuIGtvbXBsZXR0ZW4gVHJhbnNwb3J0ZXIgb2RlciBlaW5lbiBIYWx0ZXB1bmt0IGF1cyBkZW0KKyAgICBEYWVtb24uCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgIC0gMTogRXJmb2xnLgorICAgIC0gMDogVHJhbnNwb3J0ZXJ8SGFsdGVwdW5rdCBleGlzdGllcnQgbmljaHQuCisgICAgLSAtMTogS2VpbmUgQmVyZWNodGlndW5nLgorCitwdWJsaWMgdmFyYXJncyBpbnR8b2JqZWN0KiBIYXNUcmFuc3BvcnRlcihvYmplY3Qgc3RvcCwgc3RyaW5nIHRyYW5zcG9ydGVyX2lkKQorICBCZXNjaHJlaWJ1bmc6CisgICAgR2lidCBlaW5lIExpc3RlIGRlciBUcmFuc3BvcnRlciBhdXMsIGRlbiBkZW4gSGFsdGVwdW5rdCBhbmxhdWZlbiwgb2RlcgorICAgIHBydWVmdCBhdWYgZWluZW4gYmVzdGltbXRlbiBUcmFuc3BvcnRlci4KKyAgUnVlY2tnYWJld2VydGU6CisgICAgLSAwOiBIYWx0ZXB1bmt0IGlzdCBrZWluIE9iamVrdCwgZGVtIEhhbHRlcHVua3Qgc2luZCBrZWluZSBUcmFuc3BvcnRlcgorICAgICAgICAgenVnZW9yZG5ldCwKKyAgICAgICAgIGRpZSBUcmFuc3BvcnRlciBzaW5kIG5pY2h0IGdlbGFkZW4KKyAgICAgICAgIG9kZXIsIGJlaSBhbmdhYmUgdm9uIDx0cmFuc3BvcnRlcj46IDx0cmFuc3BvcnRlcj4gZmFlaHJ0IGRlbiBIYWZlbgorICAgICAgICAgbmljaHQgYW4uCisgICAgLSBvYmplY3QqOiBMaXN0ZSBtaXQgZWluZW0gb2RlciBtZWhyZXJlbiBUcmFuc3BvcnRlcm4uCisgIEJlbWVya3VuZzoKKyAgICBBdWNoIGJlaSBkZXIgQW5nYWJlIHZvbiA8dHJhbnNwb3J0ZXJfaWQ+IGtvZW5uZW4gbWVocmVyZSBPYmpla3RlCisgICAgenVydWVja2dlZ2ViZW4gd2VyZGVuLCBlcyB3aXJkIG1pdHRlbHMgaWQoKSBnZWZpbHRlcnQuCisKK3B1YmxpYyBtaXhlZCBSb3V0ZUV4aXN0cyhvYmplY3QgdHJhbnNwb3J0ZXIsIHN0cmluZyBkZXN0KQorICBCZXNjaHJlaWJ1bmc6CisgICAgUHJ1ZWZ0IGF1ZiBrb3JyZWt0ZSBQYXJhbWV0ZXIgdW5kIGxlaXRldCBkaWUgQW5mcmFnZSBhbgorICAgIC9zdGQvdHJhbnNwb3J0IHdlaXRlci4KKyAgUnVlY2tnYWJld2VydGU6CisgICAgLSAwOiA8dHJhbnNwb3J0ZXI+IGlzdCBrZWluIE9iamVrdCBvZGVyIDxkZXN0PiBpc3Qga2VpbiBTdHJpbmcuCisgICAgLSBEYXMgRXJnZWJuaXMgdm9uIHRyYW5zcG9ydGVyLT5IYXNSb3V0ZShkZXN0KTsKKworcHVibGljIG1hcHBpbmcgUXVlcnlUcmFuc3BvcnRlcnMoKQorcHVibGljIG1hcHBpbmcgUXVlcnlBbGxTdG9wcygpIAorcHVibGljIG1hcHBpbmcgUXVlcnlUcmFuc3BvcnRlckJ5U3RvcChzdHJpbmcgc3RvcCkKK3B1YmxpYyBtYXBwaW5nIFF1ZXJ5U3RvcHNCeVRyYW5zcG9ydGVyKHN0cmluZyB0cmFuc3BvcnRlcikKKyAgQmVzY2hyZWlidW5nOgorICAgIEdpYnQgZGFzIGpld2lsaWdlIGdlZmlsdGVydGUgb2RlciB1bmdlZmlsdGVydGUgTWFwcGluZyBhdXMuCisgIFJ1ZWNrZ2FiZXdlcnRlOgorICAgIE1hcHBpbmcgbWl0IGRlbSBFcmdlYm5pcy4KKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdworCisjaW5jbHVkZSA8dHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisKKyNkZWZpbmUgVFJBTlNQT1JURVIgMAorI2RlZmluZSBTVE9QIDEKKworI2RlZmluZSBNRU1PUlkgIi9zZWN1cmUvbWVtb3J5IgorCisvLyBLZXk6IHN0cmluZyBTY2hpZmYuCisvLyBWYWx1ZTA6IHN0cmluZyogSGFlZmVuLCBkaWUgdm9uIDxTY2hpZmY+IGFuZ2VmYWhyZW4gd2VyZGVuLgorbWFwcGluZyB0cmFuc3BvcnRlcnMgPSAoW10pOworLy8gS2V5OiBzdHJpbmcgSGFmZW4KKy8vIFZhbHVlMDogc3RyaW5nKiBTY2hpZmZlLCBkaWUgPEhhZmVuPiBhbmZhaHJlbi4KK21hcHBpbmcgc3RvcHMgPSAoW10pOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBWb20gTUVNT1JZIGRpZSBEYXRlbiBhYmhvbGVuLgorICAvLyBXZW5uIGtlaW5lIGRhLCB3YXIgdmVybXV0bGljaCBSZWJvb3QsIGRhbm4gbXVlc3NlbiB3aXIgd2FydGVuLCBiaXMgZGllCisgIC8vIFRyYW5zcG9ydGVyIHNpY2ggd2llZGVyIG1lbGRlbi4gQWJlciBkaWUgTWFwcGluZ3MgbXVlc3NlbiBpbnMgTWVtb3J5CisgIC8vIGdlc2NocmllYmVuIHdlcmRlbi4KKyAgbWFwcGluZyB0bXAgPSBNRU1PUlktPkxvYWQoInN0b3BzIik7CisgIGlmIChtYXBwaW5ncCh0bXApKQorICB7CisgICAgc3RvcHMgPSB0bXA7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKE1FTU9SWS0+U2F2ZSgic3RvcHMiLHN0b3BzKSAhPSAxKQorICAgICAgcmFpc2VfZXJyb3IoIkNvdWxkIG5vdCBzYXZlIG1lbW9yeSB0byAvc2VjdXJlL21lbW9yeS4iKTsKKyAgfQorICB0bXAgPSBNRU1PUlktPkxvYWQoInRyYW5zcG9ydGVycyIpOworICBpZiAobWFwcGluZ3AodG1wKSkKKyAgeworICAgIHRyYW5zcG9ydGVycyA9IHRtcDsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoTUVNT1JZLT5TYXZlKCJ0cmFuc3BvcnRlcnMiLHRyYW5zcG9ydGVycykgIT0gMSkKKyAgICAgIHJhaXNlX2Vycm9yKCJDb3VsZCBub3Qgc2F2ZSBtZW1vcnkgdG8gL3NlY3VyZS9tZW1vcnkuIik7CisgIH0KK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzKQoreworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIExvZXNjaGZ1bmt0aW9uCitwcml2YXRlIGludCBfcmVtb3ZlX2RhdGEoc3RyaW5nfG9iamVjdCBrZXksIGludCB3aGF0KQoreworICBtYXBwaW5nIGZpcnN0LHNlY29uZDsKKyAgLy8gRXJzdG1hbCBkaWUgQXJiZWl0c21hcHBpbmdzIGJlZnVlbGxlbi4KKyAgaWYod2hhdD09VFJBTlNQT1JURVIpCisgIHsKKyAgICBmaXJzdD10cmFuc3BvcnRlcnM7CisgICAgc2Vjb25kPXN0b3BzOworICB9CisgIGVsc2UKKyAgeworICAgIGZpcnN0PXN0b3BzOworICAgIHNlY29uZD10cmFuc3BvcnRlcnM7CisgIH0KKworICAvLyBLZXkgYXVmIGVpbmVuIFN0cmluZyBub3JtYWxpc2llcmVuLgorICBpZihvYmplY3RwKGtleSkpCisgIHsKKyAgICBrZXk9b2JqZWN0X25hbWUoa2V5KTsKKyAgfQorCisgIGlmKCFtZW1iZXIoZmlyc3Qsa2V5KSkKKyAgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRXJzdG1hbCBhdXMgZGVtIGpld2VpbHMgYW5kZXJlbiBNYXBwaW5nIGF1c3RyYWdlbi4KKyAgZm9yZWFjaChzdHJpbmcgcyA6IGZpcnN0W2tleV0pCisgIHsKKyAgICAvLyBOaWNodCBleGlzdGVudCBvZGVyIG5pY2h0IHp1Z2VvcmRuZXQgLT4gd2VpdGVyLgorICAgIGlmKCFtZW1iZXIoc2Vjb25kLHMpIHx8IG1lbWJlcihzZWNvbmRbc10sa2V5KT09LTEpCisgICAgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHNlY29uZFtzXS09KHtrZXl9KTsKKyAgICBpZiAoIXNpemVvZihzZWNvbmRbc10pKQorICAgICAgbV9kZWxldGUoc2Vjb25kLHMpOworICB9CisgIC8vIEpldHp0IG5vY2ggYXVzIGRlbSBlaWdlbmVuIE1hcHBpbmcgYXVzdHJhZ2VuLgorICBtX2RlbGV0ZShmaXJzdCxrZXkpOworICByZXR1cm4gMTsKK30KKworLy8gRWluIGtvbXBsZXR0ZXMgU2NoaWZmIGVudGZlcm5lbi4KK3B1YmxpYyBpbnQgUmVtb3ZlVHJhbnNwb3J0ZXIob2JqZWN0fHN0cmluZyB0cmFuc3BvcnRlcikKK3sKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIUlTX0FSQ0goZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkpIHJldHVybiAtMTsKKyAgcmV0dXJuIF9yZW1vdmVfZGF0YSh0cmFuc3BvcnRlcixUUkFOU1BPUlRFUik7Cit9CisKKy8vIEVudGZlcm50IGVpbmVuIGtvbXBsZXR0ZW4gSGFmZW4gYXVzIGRlbSBEYWVtb24KK3B1YmxpYyBpbnQgUmVtb3ZlU3RvcChvYmplY3R8c3RyaW5nIHN0b3ApCit7CisgIGlmIChleHRlcm5fY2FsbCgpICYmICFJU19BUkNIKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpKSByZXR1cm4gLTE7CisgIHJldHVybiBfcmVtb3ZlX2RhdGEoc3RvcCxTVE9QKTsKK30KKworLy8gU2V0enQgZGllIGFrdHVlbGxlIFJvdXRlIGVpbmVzIFRyYW5zcG9ydGVycy4KKy8vIERpZSBSb3V0ZSBoaWVyIGlzdCBhbGxlcmRpbmdzIG51ciBkaWUgTGlzdGUgdm9uIEhhbHRlcHVua3RlbiAtIG5pY2h0IGRlcgorLy8gUmVzdCwgZGVyIGluIGRlbiBSb3V0ZW4gaW4gZGVuIFRyYW5zcG9ydGVyIGFiZ2VsZWd0IGlzdC4KKy8vIFdpcmQgdm9uIC9zdGQvdHJhbnNwb3J0IGdlcnVmZW4sIHdlbm4gUF9OT19UUkFWRUxJTkcgbmljaHQgZ2VzZXR6dCBpc3QuCitwdWJsaWMgaW50IEFkZFJvdXRlKHN0cmluZyB0cmFuc3BvcnRlciwgc3RyaW5nKiBsX3N0b3BzKQoreworICBpZiAoIXN0cmluZ3AodHJhbnNwb3J0ZXIpIHx8ICFwb2ludGVycChsX3N0b3BzKSB8fCAhc2l6ZW9mKGxfc3RvcHMpKQorICAgIHJldHVybiAwOworCisgIGlmICgodHJhbnNwb3J0ZXJbMC4uMl0gPT0gIi9wLyIgfHwgdHJhbnNwb3J0ZXJbMC4uOF0gPT0gIi9wbGF5ZXJzLyIpCisgICAgICAmJiAhSVNfQVJDSChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkgCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBEYW1pdCBzaW5kIGFsbGUgQWJmcmFnZW4gYXVmIGZpbmRfb2JqZWN0KHRyYW5zcG9ydGVyfHN0b3ApIHVlYmVyZmx1ZXNzaWcsCisgIC8vIGltIFp3ZWlmZWxzZmFsbCBrbmFsbHQgZXMgbmFlbWxpY2ggaGllci4gOy0pCisgIHRyYW5zcG9ydGVyID0gb2JqZWN0X25hbWUobG9hZF9vYmplY3QodHJhbnNwb3J0ZXIpKTsKKworICAvLyBXZW5uIGRpZSByb3V0ZSBiZXJlaXRzIGV4aXN0aWVydCwgYXVzdHJhZ2VuLiBEaWVzIGlzdCBub2V0aWcsIHdlaWwgZGllCisgIC8vIEhhbHRlcHVua3RlIGphIGF1Y2ggYmVyZWluaWd0IHdlcmRlbiBtdWVzc2VuLgorICBpZiAobWVtYmVyKHRyYW5zcG9ydGVycywgdHJhbnNwb3J0ZXIpKQorICAgIFJlbW92ZVRyYW5zcG9ydGVyKHRyYW5zcG9ydGVyKTsKKworICAvLyBUcmFuc3BvcnRlciBlaW50cmFnZW4sIGRpZSBSb3V0ZSB3aXJkIGRhYmVpIGltbWVyIHVlYmVyc2NocmllYmVuLCB3ZW5uCisgIC8vIGRlciBUcmFuc3BvcnRlciBzY2hvbiBiZWthbm50IGlzdC4gWmllbDogaGllciBpc3QgaW1tZXIgZGllIGFrdHVlbGwKKyAgLy8ga29uZmlndXJpZXJ0ZSBSb3V0ZSBkcmluLgorICBtX2FkZCh0cmFuc3BvcnRlcnMsIHRyYW5zcG9ydGVyLCBsX3N0b3BzKTsKKworICAvLyBOYWNoIG9iaWdlbiBTY2hlbWEsIG51ciBkaWVzbWFsIEhhbHRlcHVua3RlIHVuZCB6dWdlaG9lcmlnZSBTY2hpZmZlIAorICAvLyBlaW50cmFnZW4uCisgIGZvcmVhY2goc3RyaW5nIHN0b3AgOiBsX3N0b3BzKQorICB7CisgICAgaWYgKCFtZW1iZXIoc3RvcHMsc3RvcCkpCisgICAgeworICAgICAgbV9hZGQoc3RvcHMsIHN0b3AsICh7dHJhbnNwb3J0ZXJ9KSk7CisgICAgfQorICAgIGVsc2UgaWYgKG1lbWJlcihzdG9wc1tzdG9wXSx0cmFuc3BvcnRlcikgPT0gLTEpCisgICAgeworICAgICAgc3RvcHNbc3RvcF0gKz0gKHsgdHJhbnNwb3J0ZXIgfSk7CisgICAgfQorICB9CisgIHJldHVybiAxOworCit9CisKKy8vIEFiZnJhZ2Ugb2IgZWluIFNjaGlmZiBlaW5lbiBIYWZlbiBhbmZhZWhydC4KK3B1YmxpYyB2YXJhcmdzIGludHxvYmplY3QqIEhhc1RyYW5zcG9ydGVyKG9iamVjdCBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRyYW5zcG9ydGVyX2lkKQoreworICBpZiAoIW9iamVjdHAoc3RvcCkpIHJldHVybiAwOworCisgIDxzdHJpbmd8b2JqZWN0PiogdHJhbnM9c3RvcHNbb2JqZWN0X25hbWUoc3RvcCldOworICBpZiAoIXBvaW50ZXJwKHRyYW5zKSkgcmV0dXJuIDA7CisKKyAgLy8gRWlnZW50bGljaCBzb2xsdGVuIHNpY2ggVHJhbnNwb3J0ZXIgb3JkZW50bGljaCBhYm1lbGRlbi4uLiBBYmVyIHp1cgorICAvLyBTaWNoZXJoZWl0IGRpZSBuaWNodCBnZWZ1bmRlbmVuIE9iamVrdGUgYXVzZmlsdGVybi4KKyAgdHJhbnMgPSBtYXAodHJhbnMsICMnZmluZF9vYmplY3QpIC0gKHswfSk7CisKKyAgLy8gV2VubiBuZSBiZXN0aW1tdGUgSUQgZ2VzdWNodCB3aXJkLCBudXIgZGllc2UgVHJhbnNwb3J0ZXIgbGllZmVybi4KKyAgaWYgKHN0cmluZ3AodHJhbnNwb3J0ZXJfaWQpKQorICAgIHRyYW5zID0gZmlsdGVyX29iamVjdHModHJhbnMsICJpZCIsIHRyYW5zcG9ydGVyX2lkKTsKKworICByZXR1cm4gc2l6ZW9mKHRyYW5zKSA/IHRyYW5zIDogMDsKK30KKworcHVibGljIG1peGVkIFJvdXRlRXhpc3RzKG9iamVjdCB0cmFuc3BvcnRlciwgc3RyaW5nIGRlc3QpCit7CisgIGlmICghb2JqZWN0cCh0cmFuc3BvcnRlcikgfHwgIXN0cmluZ3AoZGVzdCkpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdHJhbnNwb3J0ZXItPkhhc1JvdXRlKGRlc3QpOworfQorCitwdWJsaWMgbWFwcGluZyBRdWVyeVRyYW5zcG9ydGVycygpCit7CisgIHJldHVybiBkZWVwX2NvcHkodHJhbnNwb3J0ZXJzKTsKK30KKworcHVibGljIG1hcHBpbmcgUXVlcnlBbGxTdG9wcygpCit7CisgIHJldHVybiBkZWVwX2NvcHkoc3RvcHMpOworfQorCisvLyBMaWVmZXJ0IGFsbGUgVHJhbnNwb3J0ZXIgbWl0IGlocmVuIEhhbHRlcHVua3RlbiB6dXJ1ZWNrLCBkaWUgZGllc2VuIEhhbHQgYW5zdGV1ZXJuLgorcHVibGljIG1hcHBpbmcgUXVlcnlUcmFuc3BvcnRCeVN0b3Aoc3RyaW5nIHN0b3ApCit7CisgIG1hcHBpbmcgcmVzPW1fYWxsb2NhdGUoNCk7CisgIGZvcmVhY2goc3RyaW5nIHMsIHN0cmluZyogYXJyIDogdHJhbnNwb3J0ZXJzKQorICB7CisgICAgaWYobWVtYmVyKGFycixzdG9wKSE9LTEpCisgICAgeworICAgICAgbV9hZGQocmVzLHMsYXJyKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLy8gTGllZmVydCBhbGxlIEhhbHRlcHVua3RlIG1pdCBpaHJlbiBUcmFuc3BvcnRlcm4genVydWVjaywgZGllIGRpZXNlcgorLy8gdHJhbnNwb3J0ZXIgYW5zdGV1ZXJ0LgorcHVibGljIG1hcHBpbmcgUXVlcnlTdG9wc0J5VHJhbnNwb3J0ZXIoc3RyaW5nIHRyYW5zcG9ydGVyKQoreworICBtYXBwaW5nIHJlcz1tX2FsbG9jYXRlKDQpOworICBmb3JlYWNoKHN0cmluZyBzLCBzdHJpbmcqIGFyciA6IHN0b3BzKQorICB7CisgICAgaWYobWVtYmVyKGFycix0cmFuc3BvcnRlcikhPS0xKQorICAgIHsKKyAgICAgIG1fYWRkKHJlcyxzLGFycik7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKZGlmZiAtLWdpdCBhL3AvZGFlbW9uL3VwdGltZV9tYXN0ZXIuYyBiL3AvZGFlbW9uL3VwdGltZV9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGE3MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvcC9kYWVtb24vdXB0aW1lX21hc3Rlci5jCkBAIC0wLDAgKzEsMTEwIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZSwgbm9fc2hhZG93CisKKyNpbmNsdWRlICIvcC9kYWVtb24vY2guaCIKKyNpbmNsdWRlICIvcC9kYWVtb24vdXB0aW1lX21hc3Rlci5oIgorCisvLy8gUHJvdG90eXBlbiAvLy8KKwordm9pZCBjcmVhdGUoKTsKK3ZvaWQgcmVzZXQoKTsgCisKK3ZvaWQgU2F2ZU1heFVwdGltZSgpOworbWFwcGluZyBRdWVyTWF4VXB0aW1lKCk7CisKKy8vLyBHbG9iYWxlIFZhcmlhYmxlbiAvLy8KK3N0YXRpYyBpbnQgbmV4dF9zYXZlX3VwdGltZTsKK3N0YXRpYyBpbnQgbWF4X3VwdGltZV9yZWFjaGVkOworc3RhdGljIGludCBsYXN0X3JlY29yZF9ib290OworCisvLy8gRnVua3Rpb25lbiAvLy8KKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIHJlc2V0KCk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBjYWxsX291dCgiU2F2ZU1heFVwdGltZSIsMSk7CisgIHNldF9uZXh0X3Jlc2V0KDMwMCk7Cit9CisKKy8vIElzdCBlaW5lIFJla29yZC1VcHRpbWUgZXJyZWljaHQsIHdpcmQgZGllc2UgaGllciBnZXNwZWljaGVydC4KK3ZvaWQgU2F2ZU1heFVwdGltZSgpCit7CisgIGludCBtYXhfc2h1dCwgbWF4X2Jvb3Q7CisgIAorICAvLyBMb2hudCBlcywgc2Nob24gd2llZGVyIHp1IHBydWVmZW4/CisgIGlmICh0aW1lKCk+bmV4dF9zYXZlX3VwdGltZSkKKyAgeworICAgIC8vIEluaXRpYWxpc2llcmVuCisgICAgaWYgKG5leHRfc2F2ZV91cHRpbWU9PTApCisgICAgeworICAgICAgREVCVUcoIk1hc3RlcmluaXQiKTsKKyAgICAgIAorICAgICAgLy8gWmVpdCBiZXJlY2huZW4sIGFiIGRlciBlaW4gUmVrb3JkIGF1Zmdlc3RlbGx0IGlzdC4KKyAgICAgIC8vIFZvcmhlciBicmF1Y2h0IG5peGh0cyBtZWhyIGdlcHJ1ZWZ0IHdlcmRlbgorICAgICAgc3NjYW5mKHJlYWRfZmlsZShNQVhfVVBUSU1FKXx8IjAgMCIsIiVkICVkIixsYXN0X3JlY29yZF9ib290LCBtYXhfc2h1dCk7CisgICAgICBuZXh0X3NhdmVfdXB0aW1lPWxhc3RfcmVib290X3RpbWUoKSsobWF4X3NodXQtbGFzdF9yZWNvcmRfYm9vdCkrMTsgCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgREVCVUcoIlJla29yZCBuZXUgc3BlaWNoZXJuLiIpOworCSAgICAKKyAgICAgIC8vIE5ldWVuIFJla29yZCBpbiBEYXRlaSBzY2hyZWliZW4uCisgICAgICBjYXRjaChybShNQVhfVVBUSU1FKTtwdWJsaXNoKTsKKyAgICAgIHdyaXRlX2ZpbGUoTUFYX1VQVElNRSwgbGFzdF9yZWJvb3RfdGltZSgpKyIgIit0aW1lKCkpOworICAgICAgCisgICAgICAvLyBKZXR6dCBjaGVja2VuLCBvYiBkaWUgVXB0aW1lIGdyYWRlIGdla25hY2t0IHd1cmRlIC4uLgorICAgICAgLy8gV2VubiBqYSwgZGFubiBlaW5lIE1lbGR1bmcgYW4gZGVuIE1hc3RlcgorICAgICAgaWYobGFzdF9yZWJvb3RfdGltZSgpIT1sYXN0X3JlY29yZF9ib290KQorICAgICAgeworCURFQlVHKCJSZWtvcmRtZWxkdW5nLiBNQjoiK2xhc3RfcmVjb3JkX2Jvb3QrIiBMVToiK2xhc3RfcmVib290X3RpbWUoKSk7CisKKwkvLyBOdXIgZWlubWFsIHBybyBSZWtvcmQgVXB0aW1lIG1lbGRlbiAuLi4KKwlsYXN0X3JlY29yZF9ib290PWxhc3RfcmVib290X3RpbWUoKTsKKworCS8vIEh1cnJhYWFoIDopCisgICAgICAgIENITUFTVEVSLT5qb2luKFJFQ09SRF9DSEFOTkVMLHRoaXNfb2JqZWN0KCkpOworCUNITUFTVEVSLT5zZW5kKFJFQ09SRF9DSEFOTkVMLHRoaXNfb2JqZWN0KCksCisJIls8TWFzdGVSPjpMYXJzXSBXb3csIGVpbmUgUmVrb3JkLVVwdGltZS5cbiIKKwkiWzxNYXN0ZVI+Ok1lcmxpbl0gRGFzIGVybGVidCBtYW4gYXVjaCBuaWNodCBhbGxlIFRhZ2UgLi4uXG4iCisJIls8TWFzdGVSPjpEZXIgR2FtZURyaXZlcl0gRGFubiB3aXJkIGVzIHdvaGwgWmVpdCBmdWVyIGVpbmVuIFJlYm9vdCwgb2Rlcj9cbiIKKwkiWzxNYXN0ZVI+Ok1lcmxpbl0gRmF1bGVzIFN0dWVjaywgYXJiZWl0ZSB3ZWl0ZXIhXG4iCisJIls8TWFzdGVSPjpEZXIgR2FtZURyaXZlcl0gT2NoIG1lbm5vISIsCisJICBNU0dfRU1QVFkpOworCUNITUFTVEVSLT5sZWF2ZShSRUNPUkRfQ0hBTk5FTCx0aGlzX29iamVjdCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gR2lidCBEYXRlbiB6dXIgYmlzaGVyIG1heGltYWxlbiBVcHRpbWUgenVydWVjazogKDI5OSBUaWNrcykKKy8vIDEuKSBXYW5uIHd1cmRlIGdlYm9vdGV0CisvLyAyLikgV2FubiBlbmRldGUgZGllIFVwdGltZQorLy8gMy4pIFdhbm4gd2lyZCBkaWVzZXIgUmVrb3JkIGdlYnJvY2hlbj8KKy8vIDQuKSBEYXVlciBkZXIgVXB0aW1lIGFscyBsZXNiYXJlciBTdHJpbmcuCittYXBwaW5nIFF1ZXJ5TWF4VXB0aW1lKCkKK3sKKyAgaW50IHQsIHRtcCwgbWF4X2Jvb3QsIG1heF9zaHV0OworICBzdHJpbmcgczsKKworICBzc2NhbmYocmVhZF9maWxlKE1BWF9VUFRJTUUpfHwiMCAwIiwiJWQgJWQiLG1heF9ib290LCBtYXhfc2h1dCk7CisKKyAgdD1tYXhfc2h1dC1tYXhfYm9vdDsKKworICBzPSIiOworICBpZiAodD49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgVGFnJXMsICIsdG1wPXQvODY0MDAsKHRtcD09MT8iIjoiZSIpKTsKKyAgaWYgKHQ+PTM2MDApCisgICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKKyAgaWYgKHQ+NjApCisgICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKKyAgcys9c3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7CisKKyAgcmV0dXJuIChbImJlZ2lubiI6bWF4X2Jvb3QsIAorICAgICAgICAgICAiZW5kZSI6bWF4X3NodXQsIAorCSAgICJuYWVjaHN0ZXIgcmVrb3JkIjpsYXN0X3JlYm9vdF90aW1lKCkrKG1heF9zaHV0LW1heF9ib290KSwgCisJICAgInJla29yZCBhbHMgc3RyaW5nIjpzXSk7Cit9CmRpZmYgLS1naXQgYS9wL2RhZW1vbi91cHRpbWVfbWFzdGVyLmggYi9wL2RhZW1vbi91cHRpbWVfbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyZTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3VwdGltZV9tYXN0ZXIuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fVVBUSU1FX01BU1RFUl9fCisjZGVmaW5lIF9fVVBUSU1FX01BU1RFUl9fCisKKyNkZWZpbmUgVVBUSU1FX01BU1RFUiAgIi9wL2RhZW1vbi91cHRpbWVfbWFzdGVyIgorI2RlZmluZSBNQVhfVVBUSU1FICAgICAiL3AvZGFlbW9uL3NhdmUvbWF4dXB0aW1lIgorI2RlZmluZSBSRUNPUkRfQ0hBTk5FTCAiPE1hc3RlUj4iCisKKyNkZWZpbmUgREVCVUcoeCkKKy8qCisjZGVmaW5lIERFQlVHKHgpIGlmKGZpbmRfcGxheWVyKCJ2YW5pb24iKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInZhbmlvbiIpLFwKKwkJICAgICAgICAgICAgICAgICJVUFRJTUU6ICIreCsiXG4iKTsKKyovCisKKyNlbmRpZiAvKiBfX1VQVElNRV9NQVNURVJfXyAqLwpkaWZmIC0tZ2l0IGEvcC9kYWVtb24vemVudHJhbGJhbmsuYyBiL3AvZGFlbW9uL3plbnRyYWxiYW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNzRkMAotLS0gL2Rldi9udWxsCisrKyBiL3AvZGFlbW9uL3plbnRyYWxiYW5rLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB6ZW50cmFsYmFuay5jIC0tIFplbnRyYWxlIEdlbGQtVmVyd2FsdHVuZyBkZXIgSGFlbmRsZXIgaW0gTUcKKy8vICRJZDogemVudHJhbGJhbmsuYyA5MjIzIDIwMTUtMDUtMjcgMjE6NDY6NThaIFplc3N0cmEgJAorLy8KKy8qCisgKiAkTG9nOiB6ZW50cmFsYmFuay5jLHYgJAorICogUmV2aXNpb24gMS41ICAyMDAzLzEyLzMwIDExOjE3OjM0ICBWYW5pb24KKyAqIHF1ZXJ5X3ByZXZlbnRfc2hhZG93IGZlaGx0ZS4gRGFua2UgZnVlciBkZW4gSGlud2VpcyBhbiBPZ28uCisgKgorICogUmV2aXNpb24gMS40ICAyMDAzLzEyLzMwIDExOjEyOjAyICBKb2YKKyAqIEljaCBoYWIgRGlyIGRhcyBGaWxlIG1hbCBnZWtsYXV0LgorICogVmFuaW9uCisgKgorICogUmV2aXNpb24gMS4zICAxOTk1LzA3LzEwICAwNzozMTowNCAgSm9mCisgKiB0eXBvIGZpeGVkCisgKgorICogUmV2aXNpb24gMS4yICAxOTk1LzA3LzEwICAwNzoyNzo1OSAgSm9mCisgKiBVc2UgYmFuay5oCisgKiBfcXVlcnlfY3VycmVudF9tb25leQorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NS8wNy8wNSAgMTY6Mjk6MjYgIEpvZgorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vbmV5Lmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8YmFuay5oPgorCisjZGVmaW5lIFRJTUUgc3RyZnRpbWUoIiVIOiVNIix0aW1lKCkpCisjZGVmaW5lIExTIDEwMDAwMDAKKworaW50IGFsbG1vbmV5LGJhbmtfZGVmYXVsdF9wZXJjZW50LHN0b3JlX2RlZmF1bHRfcGVyY2VudCxzaG9wX2RlZmF1bHRfcGVyY2VudDsKK2ludCBmYWxsaW5nOworLy8gR2VsZG1lbmdlbjogaW4gTlBDLCBpbiBCb2Vyc2VuLCBydW1saWVnZW4sIGF1ZiBTZWhlcmthcnRlbiwgR2VzYW10c3VtbWUsCisvLyBaZWl0cHVua3QgZGVyIEJlcmVjaG51bmcuCitpbnQgKnN1bW1lbiA9ICh7MCwwLDAsMCwwLDB9KTsKKworbm9zYXZlIGludCBsYXN0X3NhdmU7Citub3NhdmUgaW50IGNvdW50ZXI7CisKK3ZvaWQgc2F2ZV9tZSgpCit7CisgIHNhdmVfb2JqZWN0KCIvcC9kYWVtb24vc2F2ZS96ZW50cmFsYmFuayIpOworICBsYXN0X3NhdmU9dGltZSgpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgYWxsbW9uZXk9NTAwMDAwOworICBiYW5rX2RlZmF1bHRfcGVyY2VudD1CQU5LX0RFRkFVTFRfUEVSQ0VOVDsKKyAgc3RvcmVfZGVmYXVsdF9wZXJjZW50PVNUT1JFX1BFUkNFTlRfTEVGVDsKKyAgc2hvcF9kZWZhdWx0X3BlcmNlbnQ9U0hPUF9QRVJDRU5UX0xFRlQ7CisgIHJlc3RvcmVfb2JqZWN0KCIvcC9kYWVtb24vc2F2ZS96ZW50cmFsYmFuayIpOworfQorCitwcml2YXRlIHZvaWQgYWRqdXN0X3BlcmNlbnRzKCkKK3sKKyAgaWYgKGFsbG1vbmV5PDUwMDAwICAgJiYgZmFsbGluZz49MCkgZmFsbGluZz0tMTsKKyAgaWYgKGFsbG1vbmV5PjEwMDAwMDAgJiYgZmFsbGluZzw9MCkgZmFsbGluZz0xOworICBpZiAoYWxsbW9uZXk8MjAwMDAwICYmIGZhbGxpbmc+MCApIGZhbGxpbmc9MDsKKyAgaWYgKGFsbG1vbmV5PjgwMDAwICAmJiBmYWxsaW5nPDAgKSBmYWxsaW5nPTA7CisgIGlmIChmYWxsaW5nPDAgJiYgISgoKytjb3VudGVyKSU1KSkKKyAgeworICAgIGJhbmtfZGVmYXVsdF9wZXJjZW50PWJhbmtfZGVmYXVsdF9wZXJjZW50K3JhbmRvbSgzKSsxOworICAgIHN0b3JlX2RlZmF1bHRfcGVyY2VudD1zdG9yZV9kZWZhdWx0X3BlcmNlbnQrcmFuZG9tKDMpKzE7CisgICAgc2hvcF9kZWZhdWx0X3BlcmNlbnQ9c2hvcF9kZWZhdWx0X3BlcmNlbnQrcmFuZG9tKDMpKzE7CisgICAgbG9nX2ZpbGUoIlpFTlRSQUxCQU5LIiwKKwlzcHJpbnRmKCIlczogUEVSQ0VOVFMgU0VUIFRPIEJBTksgJWQgU1RPUkUgJWQgU0hPUCAlZFxuIiwKKwkgIFRJTUUsYmFua19kZWZhdWx0X3BlcmNlbnQsc3RvcmVfZGVmYXVsdF9wZXJjZW50LAorCSAgc2hvcF9kZWZhdWx0X3BlcmNlbnQpLExTKTsKKyAgfQorICBpZiAoZmFsbGluZz4wKQorICB7CisgICAgYmFua19kZWZhdWx0X3BlcmNlbnQvPTI7CisgICAgc3RvcmVfZGVmYXVsdF9wZXJjZW50Lz0yOworICAgIHNob3BfZGVmYXVsdF9wZXJjZW50Lz0yOworICAgIGxvZ19maWxlKCJaRU5UUkFMQkFOSyIsCisJc3ByaW50ZigiJXM6IFBFUkNFTlRTIFNFVCBUTyBCQU5LICVkIFNUT1JFICVkIFNIT1AgJWRcbiIsCisJICBUSU1FLGJhbmtfZGVmYXVsdF9wZXJjZW50LHN0b3JlX2RlZmF1bHRfcGVyY2VudCwKKwkgIHNob3BfZGVmYXVsdF9wZXJjZW50KSxMUyk7CisgIH0KKyAgaWYgKGJhbmtfZGVmYXVsdF9wZXJjZW50PDEpIGJhbmtfZGVmYXVsdF9wZXJjZW50PTE7CisgIGlmIChiYW5rX2RlZmF1bHRfcGVyY2VudD45MCkgYmFua19kZWZhdWx0X3BlcmNlbnQ9OTA7CisgIGlmIChzdG9yZV9kZWZhdWx0X3BlcmNlbnQ8MSkgc3RvcmVfZGVmYXVsdF9wZXJjZW50PTE7CisgIGlmIChzdG9yZV9kZWZhdWx0X3BlcmNlbnQ+OTApIHN0b3JlX2RlZmF1bHRfcGVyY2VudD05MDsKKyAgaWYgKHNob3BfZGVmYXVsdF9wZXJjZW50PDEpIHNob3BfZGVmYXVsdF9wZXJjZW50PTE7CisgIGlmIChzaG9wX2RlZmF1bHRfcGVyY2VudD45MCkgc2hvcF9kZWZhdWx0X3BlcmNlbnQ9OTA7CisgIHNhdmVfbWUoKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIGFkanVzdF9wZXJjZW50cygpOworfQorCitwcml2YXRlIHZvaWQgcmVhbF9sb2coKQoreworICBsb2dfZmlsZSgiWkJBTktTVEFUVVMiLHNwcmludGYoIiVzOiAlZFxuIixkdGltZSh0aW1lKCkpLGFsbG1vbmV5KSxMUyk7Cit9CisKK3ByaXZhdGUgdm9pZCBsb2dfc3RhdGUoKQoreworICAvLyBudXIgYWxsZSAxNW1pbiBuZW4gU3RhdHVzLUxvZ2VpbnRyYWcuIFJlaWNodCB2b2VsbGlnLgorICBpZiAoZmluZF9jYWxsX291dCgjJ3JlYWxfbG9nKSA9PSAtMSkKKyAgICBjYWxsX291dCgjJ3JlYWxfbG9nLDkwMCk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHZvaWQgUGF5SW4oaW50IGFtb3VudCwgaW50IHBlcmNlbnQpCit7CisgIGlmIChhbW91bnQ8PTApIHJldHVybjsKKyAgcGVyY2VudHw9YmFua19kZWZhdWx0X3BlcmNlbnQ7CisgIGFsbG1vbmV5Kz1hbW91bnQqcGVyY2VudC8xMDA7CisgIGxvZ19maWxlKCJaRU5UUkFMQkFOSyIsCisgICAgICBzcHJpbnRmKCIlczogRWluemFobHVuZzogJWQgKCVkIGJydXR0bykgdm9uICVPXG4iLAorCVRJTUUsYW1vdW50KnBlcmNlbnQvMTAwLGFtb3VudCxwcmV2aW91c19vYmplY3QoKSksTFMpOworICBsb2dfc3RhdGUoKTsKK30KKworcHVibGljIGludCBXaXRoRHJhdyhpbnQgYW1vdW50KQoreworICBpbnQgZ290OworCisgIGlmIChhbW91bnQ8PTApIHJldHVybiAwOworICBpZiAoYWxsbW9uZXk8MCkgYWxsbW9uZXk9MDsKKyAgaWYgKCFhbGxtb25leSkKKyAgICBnb3Q9MDsKKyAgZWxzZQorICB7CisgICAgaWYgKGFtb3VudCozPGFsbG1vbmV5KQorICAgICAgZ290PWFtb3VudDsKKyAgICBlbHNlCisgICAgeworICAgICAgZ290PWFsbG1vbmV5LzM7CisgICAgICBpZiAoIWdvdCkgZ290PTE7CisgICAgfQorICAgIGFsbG1vbmV5LT1nb3Q7CisgIH0KKyAgbG9nX2ZpbGUoIlpFTlRSQUxCQU5LIixzcHJpbnRmKCIlczogQWJoZWJ1bmc6ICU2ZC8lNmQgdm9uICVPXG4iLAorCVRJTUUsZ290LCBhbW91bnQscHJldmlvdXNfb2JqZWN0KCkpLExTKTsKKyAgbG9nX3N0YXRlKCk7CisgIHJldHVybiBnb3Q7Cit9CisKK2ludCBfcXVlcnlfY3VycmVudF9tb25leSgpCit7CisgIHJldHVybiBhbGxtb25leTsKK30KKworaW50IF9xdWVyeV9iYW5rX2RlZmF1bHRfcGVyY2VudCgpCit7CisgIHJldHVybiBiYW5rX2RlZmF1bHRfcGVyY2VudDsKK30KKworaW50IF9xdWVyeV9zaG9wX3BlcmNlbnRfbGVmdCgpCit7CisgIHJldHVybiBzaG9wX2RlZmF1bHRfcGVyY2VudDsKK30KKworaW50IF9xdWVyeV9zdG9yZV9wZXJjZW50X2xlZnQoKQoreworICByZXR1cm4gc3RvcmVfZGVmYXVsdF9wZXJjZW50OworfQorCisvLyBHZWxkbWVuZ2UgaW0gU3BpZWwKK3B1YmxpYyBpbnQgKmdlbGRtZW5nZSgpIHsKKyAgCisgIGlmIChzdW1tZW5bNV0gPiB0aW1lKCktMzYwMCB8fCAhSVNfRUxERVIodGhpc19wbGF5ZXIoKSkpCisgICAgICByZXR1cm4gc3VtbWVuOworCisgIHN1bW1lbiA9IGFsbG9jYXRlKDYpOworICBvYmplY3QgKmdlbGQgPSBjbG9uZXMoR0VMRCwyKTsKKyAgZm9yZWFjaChvYmplY3Qgb2I6IGdlbGQpIHsKKyAgICBpZiAoIWVudmlyb25tZW50KG9iKSB8fCBJU19MRUFSTkVSKGVudmlyb25tZW50KG9iKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoZW52aXJvbm1lbnQob2IpLT5RdWVyeVByb3AoUF9OUEMpKQorICAgICAgLy8gaW4gTlBDCisgICAgICBzdW1tZW5bMF0rPW9iLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICAgIGVsc2UgaWYgKGxvYWRfbmFtZShlbnZpcm9ubWVudChvYikpID09IEJPRVJTRSkKKyAgICAgIC8vIGluIGJvZXJzZW4KKyAgICAgIHN1bW1lblsxXSs9b2ItPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgICAgZWxzZQorICAgICAgLy8gc29uc3QgcnVtbGllZ2VuZAorICAgICAgc3VtbWVuWzJdKz1vYi0+UXVlcnlQcm9wKFBfQU1PVU5UKTsKKyAgfQorICAvLyBTZWhlcmthcnRlbgorICBnZWxkID0gY2xvbmVzKFNFSEVSS0FSVEUsMik7CisgIG1hcHBpbmcgY2FyZHM9bV9hbGxvY2F0ZShzaXplb2YoZ2VsZCksMSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBnZWxkKSB7CisgICAgY2FyZHNbb2ItPnF1ZXJ5X293bmVyKCldID0gb2ItPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisgIH0KKyAgZm9yZWFjaChzdHJpbmcgb3duZXIsIGludCBhbW91bnQ6IGNhcmRzKQorICAgIHN1bW1lblszXSs9YW1vdW50OworICBzdW1tZW5bNF09c3VtbWVuWzBdK3N1bW1lblsxXStzdW1tZW5bMl0rc3VtbWVuWzNdOworICBzdW1tZW5bNV09dGltZSgpOworICByZXR1cm4gc3VtbWVuOworfQorCitwdWJsaWMgdm9pZCBQcmludEdlbGRtZW5nZSgpIHsKKyAgaW50ICpzdW0gPSBnZWxkbWVuZ2UoKTsKKyAgcHJpbnRmKCJOUEM6ICVkXG4iCisgICAgICAgICAiQm9lcnNlbjogJWRcbiIKKyAgICAgICAgICJydW1saWVnZW5kOiAlZFxuIgorICAgICAgICAgIlNlaGVya2FydGVuOiAlZFxuIgorICAgICAgICAgIkdlc2FtdDogJWRcbiIKKyAgICAgICAgICJaZWl0OiAlc1xuIiwKKyAgICAgICAgIHN1bVswXSxzdW1bMV0sc3VtWzJdLHN1bVszXSxzdW1bNF0sc3RyZnRpbWUoc3VtWzVdKSk7Cit9CisKK3ZvaWQgc2V0X3BlcmNlbnRzKGludCBzdG9yZSxpbnQgc2hvcCxpbnQgYmFuaykKK3sKKyAgc3RvcmVfZGVmYXVsdF9wZXJjZW50PXN0b3JlOworICBzaG9wX2RlZmF1bHRfcGVyY2VudD1zaG9wOworICBiYW5rX2RlZmF1bHRfcGVyY2VudD1iYW5rOyAKKyAgbG9nX2ZpbGUoIlpFTlRSQUxCQU5LIiwKKyAgICAgIHNwcmludGYoIiVzOiBQRVJDRU5UUyBTRVQgVE8gQkFOSyAlZCBTVE9SRSAlZCBTSE9QICVkXG4iLAorCVRJTUUsYmFua19kZWZhdWx0X3BlcmNlbnQsc3RvcmVfZGVmYXVsdF9wZXJjZW50LAorCXNob3BfZGVmYXVsdF9wZXJjZW50KSxMUyk7Cit9CisKK2ludCByZW1vdmUoKQoreworICBzYXZlX21lKCk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKyAgIAo=