ZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmhlbHAvaGxwMnNnbWwuYyBiL3Byb2dyYW1zL3dpbmhlbHAvaGxwMnNnbWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYwMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvd2luaGVscC9obHAyc2dtbC5jCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImhscGZpbGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3QgY2hhciAqaGVhZGVyMTsKKyAgY29uc3QgY2hhciAqaGVhZGVyMjsKKyAgY29uc3QgY2hhciAqc2VjdGlvbjsKKyAgY29uc3QgY2hhciAqZmlyc3RfcGFyYWdyYXBoOworICBjb25zdCBjaGFyICpuZXdsaW5lOworICBjb25zdCBjaGFyICpuZXh0X3BhcmFncmFwaDsKKyAgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFyOworICBjb25zdCBjaGFyICpiZWdpbl9pdGFsaWM7CisgIGNvbnN0IGNoYXIgKmVuZF9pdGFsaWM7CisgIGNvbnN0IGNoYXIgKmJlZ2luX2JvbGRmYWNlOworICBjb25zdCBjaGFyICplbmRfYm9sZGZhY2U7CisgIGNvbnN0IGNoYXIgKmJlZ2luX3R5cGV3cml0ZXI7CisgIGNvbnN0IGNoYXIgKmVuZF90eXBld3JpdGVyOworICBjb25zdCBjaGFyICp0YWlsOworfSBGT1JNQVQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIgY2g7CisgIGNvbnN0IGNoYXIgKnN1YnN0OworfSBDSEFSTUFQW107CisKKworRk9STUFUIGZvcm1hdCA9Cit7CisgICI8IWRvY3R5cGUgbGludXhkb2Mgc3lzdGVtPlxuIgorICAiPGFydGljbGU+XG4iCisgICI8dGl0bGU+XG4iLAorCisgICJcbjxhdXRob3I+XG4lc1xuIgorICAiPGRhdGU+XG4lc1xuIiwKKworICAiXG48c2VjdD5cbiIsCisgICJcbjxwPlxuIiwKKyAgIlxuPG5ld2xpbmU+XG4iLAorICAiXG5cbiIsCisKKyAgIiYlczsiLAorCisgICI8ZW0+IiwKKyAgIjwvZW0+IiwKKyAgIjxiZj4iLAorICAiPC9iZj4iLAorICAiPHR0PiIsCisgICI8L3R0PiIsCisKKyAgIlxuPC9hcnRpY2xlPlxuIgorfTsKKworQ0hBUk1BUCBjaGFybWFwID0KKyAge3snxicsICJBRWxpZyJ9LAorICAgeyfBJywgIkFhY3V0ZSJ9LAorICAgeyfCJywgIkFjaXJjIn0sCisgICB7J8AnLCAiQWdyYXZlIn0sCisgICB7J8MnLCAiQXRpbGRlIn0sCisgICB7J8cnLCAiQ2NlZGlsIn0sCisgICB7J8knLCAiRWFjdXRlIn0sCisgICB7J8gnLCAiRWdyYXZlIn0sCisgICB7J8snLCAiRXVtbCJ9LAorICAgeyfNJywgIklhY3V0ZSJ9LAorICAgeyfOJywgIkljaXJjIn0sCisgICB7J8wnLCAiSWdyYXZlIn0sCisgICB7J88nLCAiSXVtbCJ9LAorICAgeyfRJywgIk50aWxkZSJ9LAorICAgeyfTJywgIk9hY3V0ZSJ9LAorICAgeyfUJywgIk9jaXJjIn0sCisgICB7J9InLCAiT2dyYXZlIn0sCisgICB7J9gnLCAiT3NsYXNoIn0sCisgICB7J9onLCAiVWFjdXRlIn0sCisgICB7J9knLCAiVWdyYXZlIn0sCisgICB7J90nLCAiWWFjdXRlIn0sCisgICB7J+EnLCAiYWFjdXRlIn0sCisgICB7J+InLCAiYWNpcmMifSwKKyAgIHsn5icsICJhZWxpZyJ9LAorICAgeyfgJywgImFncmF2ZSJ9LAorICAgeyflJywgImFyaW5nIn0sCisgICB7J+MnLCAiYXRpbGRlIn0sCisgICB7J+cnLCAiY2NlZGlsIn0sCisgICB7J+knLCAiZWFjdXRlIn0sCisgICB7J+onLCAiZWNpcmMifSwKKyAgIHsn6CcsICJlZ3JhdmUifSwKKyAgIHsn6ycsICJldW1sIn0sCisgICB7J+0nLCAiaWFjdXRlIn0sCisgICB7J+4nLCAiaWNpcmMifSwKKyAgIHsn7CcsICJpZ3JhdmUifSwKKyAgIHsn7ycsICJpdW1sIn0sCisgICB7J/EnLCAibnRpbGRlIn0sCisgICB7J/MnLCAib2FjdXRlIn0sCisgICB7J/8nLCAieXVtbCJ9LAorICAgeyf0JywgIm9jaXJjIn0sCisgICB7J/InLCAib2dyYXZlIn0sCisgICB7J/gnLCAib3NsYXNoIn0sCisgICB7J/UnLCAib3RpbGRlIn0sCisgICB7J/onLCAidWFjdXRlIn0sCisgICB7J/snLCAidWNpcmMifSwKKyAgIHsn+ScsICJ1Z3JhdmUifSwKKyAgIHsn/ScsICJ5YWN1dGUifSwKKyAgIHsnPCcsICJsdCJ9LAorICAgeycmJywgImFtcCJ9LAorICAgeyciJywgImRxdW90In0sCisgICB7JyMnLCAibnVtIn0sCisgICB7JyUnLCAicGVyY250In0sCisgICB7J1wnJywgInF1b3QifSwKKyNpZiAwCisgICB7JygnLCAibHBhciJ9LAorICAgeycpJywgInJwYXIifSwKKyAgIHsnKicsICJhc3QifSwKKyAgIHsnKycsICJwbHVzIn0sCisgICB7JywnLCAiY29tbWEifSwKKyAgIHsnLScsICJoeXBoZW4ifSwKKyAgIHsnOicsICJjb2xvbiJ9LAorICAgeyc7JywgInNlbWkifSwKKyAgIHsnPScsICJlcXVhbHMifSwKKyAgIHsnQCcsICJjb21tYXQifSwKKyAgIHsnWycsICJsc3FiIn0sCisgICB7J10nLCAicnNxYiJ9LAorICAgeydeJywgImNpcmMifSwKKyAgIHsnXycsICJsb3diYXIifSwKKyAgIHsneycsICJsY3ViIn0sCisgICB7J3wnLCAidmVyYmFyIn0sCisgICB7J30nLCAicmN1YiJ9LAorICAgeyd+JywgInRpbGRlIn0sCisjZW5kaWYKKyAgIHsnXFwnLCAiYnNvbCJ9LAorICAgeyckJywgImRvbGxhciJ9LAorICAgeyfEJywgIkF1bWwifSwKKyAgIHsn5CcsICJhdW1sIn0sCisgICB7J9YnLCAiT3VtbCJ9LAorICAgeyf2JywgIm91bWwifSwKKyAgIHsn3CcsICJVdW1sIn0sCisgICB7J/wnLCAidXVtbCJ9LAorICAgeyffJywgInN6bGlnIn0sCisgICB7Jz4nLCAiZ3QifSwKKyAgIHsnpycsICJzZWN0In0sCisgICB7J7YnLCAicGFyYSJ9LAorICAgeyepJywgImNvcHkifSwKKyAgIHsnoScsICJpZXhjbCJ9LAorICAgeye/JywgImlxdWVzdCJ9LAorICAgeyeiJywgImNlbnQifSwKKyAgIHsnoycsICJwb3VuZCJ9LAorICAgeyfXJywgInRpbWVzIn0sCisgICB7J7EnLCAicGx1c21uIn0sCisgICB7J/cnLCAiZGl2aWRlIn0sCisgICB7J6wnLCAibm90In0sCisgICB7J7UnLCAibXUifSwKKyAgIHswLDB9fTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIHByaW50X3RleHQKKyAqLworCitzdGF0aWMgdm9pZCBwcmludF90ZXh0KGNvbnN0IGNoYXIgKnApCit7CisgIGludCBpOworCisgIGZvciAoOyAqcDsgcCsrKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGNoYXJtYXBbaV0uY2g7IGkrKykKKwlpZiAoKnAgPT0gY2hhcm1hcFtpXS5jaCkKKwkgIHsKKwkgICAgcHJpbnRmKGZvcm1hdC5zcGVjaWFsX2NoYXIsIGNoYXJtYXBbaV0uc3Vic3QpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIGlmICghY2hhcm1hcFtpXS5jaCkKKwlwcmludGYoIiVjIiwgKnApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIG1haW4KKyAqLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIEhMUEZJTEUgICAqaGxwZmlsZTsKKyAgSExQRklMRV9QQUdFICpwYWdlOworICBITFBGSUxFX1BBUkFHUkFQSCAqcGFyYWdyYXBoOworICB0aW1lX3QgdDsKKyAgY2hhciBkYXRlWzUwXTsKKyAgY2hhciAqZmlsZW5hbWU7CisKKyAgaGxwZmlsZSA9IEhMUEZJTEVfUmVhZEhscEZpbGUoYXJnYyA+IDEgPyBhcmd2WzFdIDogIiIpOworCisgIGlmICghaGxwZmlsZSkgcmV0dXJuKDIpOworCisgIHRpbWUoJnQpOworICBzdHJmdGltZShkYXRlLCBzaXplb2YoZGF0ZSksICIleCIsIGxvY2FsdGltZSgmdCkpOworICBmaWxlbmFtZSA9IHN0cnJjaHIoaGxwZmlsZS0+bHBzelBhdGgsICcvJyk7CisgIGlmIChmaWxlbmFtZSkgZmlsZW5hbWUrKzsKKyAgZWxzZSBmaWxlbmFtZSA9IGhscGZpbGUtPmxwc3pQYXRoOworCisgIC8qIEhlYWRlciAqLworICBwcmludGYoZm9ybWF0LmhlYWRlcjEpOworICBwcmludF90ZXh0KGhscGZpbGUtPmxwc3pUaXRsZSk7CisgIHByaW50Zihmb3JtYXQuaGVhZGVyMiwgZmlsZW5hbWUsIGRhdGUpOworCisgIGZvciAocGFnZSA9IGhscGZpbGUtPmZpcnN0X3BhZ2U7IHBhZ2U7IHBhZ2UgPSBwYWdlLT5uZXh0KQorICAgIHsKKyAgICAgIHBhcmFncmFwaCA9IHBhZ2UtPmZpcnN0X3BhcmFncmFwaDsKKyAgICAgIGlmICghcGFyYWdyYXBoKSBjb250aW51ZTsKKworICAgICAgLyogU2VjdGlvbiAqLworICAgICAgcHJpbnRmKGZvcm1hdC5zZWN0aW9uKTsKKyAgICAgIGZvciAoOyBwYXJhZ3JhcGggJiYgIXBhcmFncmFwaC0+d1ZTcGFjZTsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQorCXByaW50X3RleHQocGFyYWdyYXBoLT5scHN6VGV4dCk7CisgICAgICBwcmludGYoZm9ybWF0LmZpcnN0X3BhcmFncmFwaCk7CisKKyAgICAgIGZvciAoOyBwYXJhZ3JhcGg7IHBhcmFncmFwaCA9IHBhcmFncmFwaC0+bmV4dCkKKwl7CisJICAvKiBOZXcgbGluZTsgbmV3IHBhcmFncmFwaCAqLworCSAgaWYgKHBhcmFncmFwaC0+d1ZTcGFjZSA9PSAxKQorCSAgICBwcmludGYoZm9ybWF0Lm5ld2xpbmUpOworCSAgZWxzZSBpZiAocGFyYWdyYXBoLT53VlNwYWNlID4gMSkKKwkgICAgcHJpbnRmKGZvcm1hdC5uZXh0X3BhcmFncmFwaCk7CisKKwkgIGlmIChwYXJhZ3JhcGgtPndGb250KQorCSAgICBwcmludGYoZm9ybWF0LmJlZ2luX2JvbGRmYWNlKTsKKworCSAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKKworCSAgaWYgKHBhcmFncmFwaC0+d0ZvbnQpCisJICAgIHByaW50Zihmb3JtYXQuZW5kX2JvbGRmYWNlKTsKKwl9CisgICAgfQorCisgIHByaW50Zihmb3JtYXQudGFpbCk7CisKKyAgcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgU3Vic3RpdHV0aW9ucyBmb3Igc29tZSBXSU5FTElCIGZ1bmN0aW9ucworICovCisKK0hGSUxFIE9wZW5GaWxlKCBMUENTVFIgcGF0aCwgT0ZTVFJVQ1QgKm9mcywgVUlOVCBtb2RlICkKK3sKKyAgRklMRSAqZmlsZTsKKworICBpZiAoISpwYXRoKSByZXR1cm4gKEhGSUxFKSBzdGRpbjsKKworICBmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgaWYgKCFmaWxlKSByZXR1cm4gSEZJTEVfRVJST1I7CisgIHJldHVybiAoSEZJTEUpIGZpbGU7Cit9CisKK0hGSUxFIF9sY2xvc2UoIEhGSUxFIGhGaWxlICkKK3sKKyAgZmNsb3NlKChGSUxFKikgaEZpbGUpOworICByZXR1cm4gMDsKK30KKworTE9ORyBfaHJlYWQoIEhGSUxFIGhGaWxlLCBTRUdQVFIgYnVmZmVyLCBMT05HIGNvdW50ICkKK3sKKyAgcmV0dXJuIGZyZWFkKGJ1ZmZlciwgMSwgY291bnQsIChGSUxFKikgaEZpbGUpOworfQorCitIR0xPQkFMIEdsb2JhbEFsbG9jKCBXT1JEIGZsYWdzLCBEV09SRCBzaXplICkKK3sKKyAgcmV0dXJuIChIR0xPQkFMKSBtYWxsb2Moc2l6ZSk7Cit9CisKK0xQVk9JRCBHbG9iYWxMb2NrKCBIR0xPQkFMIGhhbmRsZSApCit7CisgIHJldHVybiAoTFBWT0lEKSBoYW5kbGU7Cit9CisKK0hHTE9CQUwgR2xvYmFsRnJlZSggSEdMT0JBTCBoYW5kbGUgKQoreworICBmcmVlKChWT0lEKikgaGFuZGxlKTsKKyAgcmV0dXJuKDApOworfQorCisvKgorICogU3RyaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTkzIFluZ3ZpIFNpZ3Vyam9uc3NvbiAoeW5ndmlAaGFmcm8uaXMpCisgKi8KKworSU5UIGxzdHJjbXAoTFBDU1RSIHN0cjEsTFBDU1RSIHN0cjIpCit7CisgIHJldHVybiBzdHJjbXAoIHN0cjEsIHN0cjIgKTsKK30KKworSU5UIGxzdHJjbXBpKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQoreworICBJTlQgcmVzOworCisgIHdoaWxlICgqc3RyMSkKKyAgICB7CisgICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7CisgICAgICBzdHIxKys7CisgICAgICBzdHIyKys7CisgICAgfQorICByZXR1cm4gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKTsKK30KKworSU5UIGxzdHJsZW4oTFBDU1RSIHN0cikKK3sKKyAgcmV0dXJuIHN0cmxlbihzdHIpOworfQorCitTRUdQVFIgbHN0cmNweSggU0VHUFRSIHRhcmdldCwgU0VHUFRSIHNvdXJjZSApCit7CisgIHN0cmNweSggKGNoYXIgKil0YXJnZXQsIChjaGFyICopc291cmNlICk7CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3ZvaWQgaG1lbWNweShMUFZPSUQgaHB2RGVzdCwgTFBDVk9JRCBocHZTb3VyY2UsIExPTkcgY2JDb3B5KQoreworICBtZW1jcHkoaHB2RGVzdCwgaHB2U291cmNlLCBjYkNvcHkpOworfQorCisvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCisvKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCisvKiBFbmQ6ICAgICAgICAgICAgICAgICovCg==